反应setstate在循环上无法正常工作

时间:2020-08-30 17:21:03

标签: reactjs validation react-hooks setstate use-state

我从后端收到一个像这样的数组的验证响应

 [
        { param: "secondName", msg: "second name is required" },
        { param: "password", msg: "password is required" }
 ]

我的反应组件中有一个状态,像这样

  const [errs, setErrs] = useState({
    firstName: null,
    secondName: null,
    password: null,
    email: null,
  })

目标是仅在response.params表单上提交的状态更改我的状态,其余部分照原样null保留。 这就是我尝试过的:

const submitFoo = () => {
    console.log(localErrs) //all props are set to null (default)
    res.forEach((single) => {
        setLocalErrs({
            ...localErrs,
            [single.param]: single.msg
        });
    });
    console.log(localErrs);//only password is set to the `response.msg`, instead of `password` AND `secondName`
};

但是问题是它只是更改了我“错误状态”中的最后一项; 输出是:

{
    first: null,
    second: null,
    password: 'password is required',
    email: null,
}

ps:我通过循环遍历数组并将Errs obj的props直接设置为response.msg来尝试使用香草js,它起作用了。所以问题必须与react setstate一起使用

2 个答案:

答案 0 :(得分:3)

尝试使用胖箭头方法来设置状态,如下所示:

setLocalErrs(localErrs => ({ ...localErrs, [single.param]: single.msg }));

避免由于不同的异步调用等原因同时调用两次setter函数的状态丢失。

答案 1 :(得分:1)

避免更新state in a loop。更新状态,如:

let errObj = {}
res.forEach((single) => {
  errObj[single.param] = single.msg
})
setLocalErrs({
  ...localErrs,
  ...errObj
})

顺便说一句,您可以简单地使用:

setLocalErrs(errObj)

由于errObj具有所有更新的状态值。