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

React多待办列表项目中新增任务不渲染且状态重复更新问题求助

React多待办列表项目中新增任务不渲染且状态重复更新问题求助

我来帮你排查下这个问题,你的代码里有几个关键细节没处理好,咱们一个个解决:

1. 新任务不渲染的核心原因

看你的TodoList组件里的任务渲染部分,你在map遍历的时候没有返回Task组件,所以即使状态更新了,页面也不会渲染出新任务。

原代码:

{tasks.map((task) => {
    <Task text={task} />
})}

改成下面这样(记得给每个列表项加唯一key,React需要它来识别列表项的变化):

{tasks.map((task, idx) => (
    <Task key={idx} text={task} />
))}

或者显式写return也可以:

{tasks.map((task, idx) => {
    return <Task key={idx} text={task} />
})}

2. 状态重复更新、异常的根源:直接修改原状态对象

React的状态更新必须遵循不可变原则,你在handleAddTask里直接修改了原状态数组里的对象,导致React无法正确检测到状态变化,才出现了重复更新的奇怪现象。

原代码:

function handleAddTask(task, index) {
  setMasterTable((prev) => {
    let prevRows = prev[index].tasks;
    const newRows = [...prevRows, task];
    let prevTable = prev; // 直接引用原状态数组,和原引用完全一致
    prevTable[index].tasks = newRows; // 直接修改原数组内的对象
    return prevTable; // 返回原引用,React会误以为状态没变化
  });
}

改成完全不可变的更新方式,每次都返回新的数组和对象:

function handleAddTask(task, index) {
  setMasterTable((prev) => {
    return prev.map((item, idx) => {
      // 只修改目标索引对应的项目
      if (idx === index) {
        return {
          ...item, // 复制原项目的所有属性
          tasks: [...item.tasks, task] // 生成新的tasks数组,不修改原数组
        };
      }
      // 其他项目保持原样返回
      return item;
    });
  });
}

3. 小优化:避免空任务+清空输入框

用useRef获取输入值是没问题的,但可以加个小判断避免添加空任务,同时点击添加后清空输入框,提升用户体验:

<button onClick={() => {
    const task = taskInput.current.value.trim();    
    if (task) { // 只有输入非空时才添加任务
        addTask(task, index);
        taskInput.current.value = ''; // 清空输入框
    }
}} className="rounded-lg p-2 ml-2 text-stone-600 h-9 mt-5 w-fit">Add Task</button>

把这些修改完成后,应该就能解决任务不渲染和状态重复更新的问题啦~

备注:内容来源于stack exchange,提问作者TroglodyteTerry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:49:30