错误消息的开头为:

未捕获错误:无效的钩子调用.钩子只能在函数组件的主体内部调用.

在我try 使用调度程序更新Redux状态之前,handleChange函数运行得没有错误.

这样做效果很好:

const [alignment, setAlignment] = React.useState('12');

const handleChange = (event, newAlignment) => {
  setAlignment(newAlignment);
};

但我想把国家提升到Redux-Toolkit.按如下方式更改函数会导致错误:

const dispatch = useDispatch;

const handleChange = (event, newAlignment) => {
  dispatch(setNbTasks(newAlignment));
};

我试了几种方法,但一无所获,细节在上面.

推荐答案

您将useDispatch钩子保存到名为dispatch的变量,然后从回调函数调用钩子函数,这会打破Rules of Hooks.

仅在顶层调用挂钩

Don’t call Hooks inside loops, conditions, or nested functions.相反,始终在React函数的顶层使用Hooks, 在任何早期回归之前.通过遵循此规则,您可以确保 每次组件呈现时,都以相同的顺序调用钩子. 这就是为什么React能够正确地保持Hooks的状态 useStateuseEffect之间的联系

const dispatch = useDispatch; // dispatch === useDispatch -> true

const handleChange = (event, newAlignment) => {
  dispatch(setNbTasks(newAlignment)); // -> useDispatch(....); 😞
};

应该首先调用useDispatch钩子,并将returned调度函数保存到局部变量dispatch.

const dispatch = useDispatch(); // Invoke hook, get dispatch function

const handleChange = (event, newAlignment) => {
  dispatch(setNbTasks(newAlignment)); // Ok dispatch call now 😀
};

Javascript相关问答推荐

react 路由加载程序行为

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

fs. writeFile()vs fs.writeFile()vs fs.appendFile()

我开始使用/url?q=使用Cheerio

如何解决CORS政策的问题

扫描qr code后出错whatter—web.js

如何从调整大小/zoom 的SVG路径定义新的d属性?""

在浏览器中触发插入事件时检索编码值的能力

以Angular 实现ng-Circle-Progress时出错:模块没有导出的成员

是否可以在Photoshop CC中zoom 路径项?

向数组中的对象添加键而不改变原始变量

如何限制显示在分页中的可见页面的数量

Reaction-SWR-无更新组件

当标题被点击时,如何使内容出现在另一个div上?

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

Node.js API-queryAll()中的MarkLogic数据移动

我怎样才能得到一个数组的名字在另一个数组?

我们是否可以在reactjs中创建多个同名的路由

将以前缓存的 Select 器与querySelector()一起使用

带元素数组的Mongo聚合