You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React.js中提取array.map()为函数后无渲染且无报错求助

问题分析与修复方案

直接原因:函数未返回映射结果

你的dataMap函数内部执行了data.map(),但没有把这个map生成的元素数组返回出去。当你在JSX里调用dataMap()时,函数默认返回undefined,而React不会渲染undefined,所以页面上看不到任何内容。

修复只需要给map的结果加上return:

const dataMap = () => {
    // 关键:返回map生成的组件数组
    return data.map(data => {
        key++;
        return (
            <div key={key}>
                <h2>{data.title}</h2>
                <p className="apart">
                    Nr: {data.id} <span>Status: {!data.completed && <span>Not </span>}completed</span>
                </p>
                <h3>User: {data.userId}</h3>
                <br/><hr/><br/>
            </div>
        );
    });
}

重要优化:别用递增数字当key

你现在用key++生成key是React的反模式——这种key不与数据绑定,当数据的顺序变化、新增或删除时,React无法正确识别组件的身份,会导致不必要的重渲染,甚至出现状态错乱的问题。

直接用每条数据里的唯一标识data.id作为key才是正确的做法,同时把循环变量名改成item避免和外层的data变量混淆:

const dataMap = () => {
    return data.map(item => {
        return (
            <div key={item.id}>
                <h2>{item.title}</h2>
                <p className="apart">
                    Nr: {item.id} <span>Status: {!item.completed && <span>Not </span>}completed</span>
                </p>
                <h3>User: {item.userId}</h3>
                <br/><hr/><br/>
            </div>
        );
    });
}

进阶:整合多条件过滤逻辑

既然你有三个completed选项(all/completed/uncompleted),可以把过滤逻辑也放到函数里,让代码更简洁易维护:

const renderTodos = () => {
    // 根据completed状态过滤数据
    let filteredTodos = data;
    if (completed === 'completed') {
        filteredTodos = data.filter(item => item.completed);
    } else if (completed === 'uncompleted') {
        filteredTodos = data.filter(item => !item.completed);
    }

    // 渲染过滤后的todo列表
    return filteredTodos.map(item => (
        <div key={item.id}>
            <h2>{item.title}</h2>
            <p className="apart">
                Nr: {item.id} <span>Status: {!item.completed && <span>Not </span>}completed</span>
            </p>
            <h3>User: {item.userId}</h3>
            <br/><hr/><br/>
        </div>
    ));
}

然后在JSX里直接调用:

{data && allToDos && renderTodos()}

内容的提问来源于stack exchange,提问作者chylinski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:01:01