我从后端收到一个像这样的数组的验证响应
[
{ 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一起使用
答案 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
具有所有更新的状态值。