为了账号安全,请及时绑定邮箱和手机立即绑定

在 if 语句中调用 useState hook 的 setter 是否意味

在 if 语句中调用 useState hook 的 setter 是否意味

慕容森 2021-12-12 15:51:23
React 文档声明: 不要在循环、条件或嵌套函数内调用 Hook。调用钩子是否意味着只是调用useStateeg const [state, useState] = useState(0)?在条件中调用 setter 怎么样?这段代码是否违反了钩子规则?const [oneHook, setOneHook] = useState(0)const [anotherHook, setAnotherHook] = useState(false)if (something) {   setOneHook(1)   setAnotherHook(true)} else {     setOneHook(0);     setAnotherHook(false)}谢谢 !
查看完整描述

2 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

不,那个代码示例没有违反钩子的规则。每次组件渲染时,都会以完全相同的顺序对 useState 进行相同数量的调用,这样就可以了。

我确实想指出立即在组件主体中设置状态没有多大意义。当组件挂载时,它将使用 state 的初始值开始渲染,但在它完成渲染之前,状态已经改变,它必须重新开始。但据推测,这只是示例的一个工件,在您的实际代码中,if它将位于 useEffect 或其他一些实际代码位置内。


查看完整回答
反对 回复 2021-12-12
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

React 文档声明:不要在循环、条件或嵌套函数内调用 Hook。


好的,以下代码显示了上述语句的示例。我遇到了同样的问题,我需要在循环内设置状态,如下所示


const [someArray, setArray] = useState([]);


someValue.forEach((value, index) => {

     setArray([...someArray, value]) //this should be avoided

    });

以上事情我已经实现如下


var temp = [];

var counter = 0;

someValue.forEach((value, index) => {

    temp.push(value);

    counter++;

     if (counter === someValue.length) {

          setArray(temp)

       }

    });

如果您在循环内设置状态,则每次组件重新呈现您不想进入的状态时。


这段代码是否违反了钩子的规则


否 您的代码看起来不错,因为您仅在组件呈现时仅根据条件设置一次状态


查看完整回答
反对 回复 2021-12-12
  • 2 回答
  • 0 关注
  • 221 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信