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

React中根据变量更新组件:切换currentTodo时Todo组件消失的解决方法

修复方案

你的代码有两个关键问题导致Todo组件消失:

问题1:错误的id属性传递

原代码中id = {todoList.todoId}是错误的——todoList是数组,不存在todoId属性,应该使用当前匹配的todo对象的todoId,即todo.todoId。

问题2:低效且易出错的遍历方式

用map遍历整个数组,仅返回匹配项的组件,其余项返回undefined,虽然React会忽略undefined,但这种写法不够严谨,且当currentTodo变化时,可能因为组件key缺失或遍历逻辑问题导致渲染异常。

修改后的代码

function App() {
  const [todoList, setTodoList] = useState([
    {
      todoId: 0,
      todoName: "Personal",
      todoTasks: []
    },
    {
      todoId: 1,
      todoName: "Work",
      todoTasks: []
    },
    {
      todoId: 2,
      todoName: "College",
      todoTasks: []
    }
  ])

  const[currentTodo, setCurrentTodo] = useState(0)

  // 直接找到当前要渲染的todo对象
  const currentTodoItem = todoList.find(todo => todo.todoId === currentTodo)

  return (
    <>
      <Navbar 
        todo={todoList}
        currentTodo={currentTodo}
        setCurrentTodo={setCurrentTodo}
      />
      {/* 找到匹配的todo后再渲染组件,同时添加key属性 */}
      {currentTodoItem && (
        <Todo 
          key={currentTodoItem.todoId}
          currentTodo={currentTodo}
          todoList={todoList}
          setTodoList={setTodoList}
          id={currentTodoItem.todoId}
        />
      )}
      {console.log(currentTodo)}
      {console.log(todoList[currentTodo])}
    </>
  )
}

额外说明

  • 使用find方法直接定位目标todo对象,比遍历整个数组更高效,逻辑也更清晰。
  • 给Todo组件添加key属性,确保React能正确识别组件的更新,避免不必要的卸载和重建。
  • 通过currentTodoItem && ...的条件渲染,确保只有找到匹配的todo时才渲染组件,防止渲染undefined。

内容的提问来源于stack exchange,提问作者Anonymous _-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:45:05