2 回答

TA贡献1995条经验 获得超2个赞
this.setState
中的两个调用onSubmitHandler
将一起进行批处理。
来自React Docs - setState():
将 setState() 视为请求而不是更新组件的即时命令。为了更好地感知性能,React 可能会延迟它,然后在一次传递中更新多个组件。React 不保证状态更改会立即应用。
setState() 并不总是立即更新组件。它可能会分批更新或将更新推迟到以后。这使得在调用 setState() 之后立即读取 this.state 成为一个潜在的陷阱
所以当你这样做时...this.state.errors
,this.state.errors
在两个if
块中,指的是一个空对象。结果,您只能在状态中看到对象surname
中的键。errors
您可以通过复制this.state.errors
对象来解决此问题,在复制的对象中添加键,然后将该复制的对象传递给this.setState
.
onSubmitHandler = e => {
e.preventDefault();
// clone the "errors" object
const errors = { ...this.state.errors };
//Check if first Name is returned empty
if(this.state.user.name.trim().length === 0) {
errors.name = "This field is required";
}
//Check if last name is returned empty
if(this.state.user.surname.trim().length === 0) {
errors.surname = "This field is required";
}
this.setState({ errors });
}

TA贡献1818条经验 获得超3个赞
这是因为第二次传播仍然使用 this.state.errors 的旧值,因为它还没有改变。在执行 onSubmitHandler 之后,两个 setStates 可能(在您的情况下:肯定是)稍后进行状态更新。
将 setState 参数更改为自动使用最新状态的函数:
onSubmitHandler = e => {
e.preventDefault();
//Check if first Name is returned empty
if (this.state.user.name.trim().length === 0) {
this.setState(state => ({
errors: {
...state.errors,
name: "This field is required"
}
}));
}
//Check if last name is returned empty
if (this.state.user.surname.trim().length === 0) {
this.setState(state => ({
errors: {
...state.errors,
surname: "This field is required"
}
}));
return;
}
}
添加回答
举报