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

React Todo项目点击添加按钮触发useSelector无效Hook调用错误

报错原因

核心问题是违反了Hook的使用规则,具体是你在AddTodo.jsx的按钮点击事件回调里直接调用了TodoList组件函数:

<button
  type= "submit"
  onClick={TodoList}>Add
</button>

React Hook只能在函数组件渲染的顶层作用域调用,点击事件触发时调用TodoList,此时处于事件回调的上下文,不属于组件正常渲染的上下文,TodoList内部的useSelector就触发了无效Hook调用报错。

修复方案

第一步:修正AddTodo组件的核心错误

把按钮的onClick绑定到你已经定义的addHandler添加逻辑上,不要直接绑定TodoList组件,同时将TodoList放到正常的组件渲染树中,顺便修正input属性的错误写法:

// AddTodo.jsx 修正后的return部分
return (
  <div>
    <input
      type="text"
      value={input} // 原属性名input错误,修正为value
      onChange={(event) => inputHandler(event.target.value)}
      placeholder="Enter here..."
    />
    <button
      type= "button" // submit类型默认会触发表单提交,这里改成button更合适
      onClick={addHandler}>Add
    </button>
    {/* TodoList作为正常组件放在渲染树中 */}
    <TodoList />
  </div>
);

第二步:修正其他配套逻辑的小问题

  • actions.js中的SetValueInput无异步需求,不需要使用thunk异步写法,改成普通action创建函数即可:
// 修正后的SetValueInput
export const SetValueInput = (t) => {
  return {
    type: SET_VALUE,
    id:nextTodo++,
    text: t
  }
}
  • TodoList.jsx里的列表渲染不要嵌套ul,把内部的ul改为li:
{list.map((todo) => (
  <li key={todo.id}>{todo.text}</li>
))}
  • reducers.js里的初始状态调整为空数组,避免渲染无意义的空待办项:
let initial_state = []

修改完成后即可解决Hook报错,Todo功能也能正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:09:01