【发布时间】:2018-03-13 19:19:56
【问题描述】:
(我知道这是一个简单的问题。在发帖之前我已经尝试在前面的问题中找到答案。关于 setState 是异步的,关于你可以使用回调函数等的问题有很多,但我没有找到类似以下的问题)。
在 React 中实现一个简单的表单时,例如 here 所示的表单(在 controlled components 标题下,也复制在下面):
由于setState 是异步的,因此不能保证该示例有效,对吧? (由于handleSubmit 打印this.state.value,但不能保证它已经设置,当handleSubmit 被调用时)。
有没有办法确保 handleSubmit 仅在表单中所有受控组件的状态更改完成后才被调用(并且不使用 redux 或类似的东西)?
这是从reactjs.org 复制的代码(我复制它是为了确保即使 URL 更改也可以读取它):
lass NameForm extends React.Component {
constructor(props) {
super(props);
this.state = {value: ''};
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({value: event.target.value});
}
handleSubmit(event) {
alert('A name was submitted: ' + this.state.value);
event.preventDefault();
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
Name:
<input type="text" value={this.state.value} onChange={this.handleChange} />
</label>
<input type="submit" value="Submit" />
</form>
);
}
}
【问题讨论】:
-
你可以禁用提交按钮...
disabled = {this.state.value == ''} -
或者,如果您想获得创意,您可以在您的状态中添加一个名为
submittable的布尔变量。在您的 handleChange 函数(或任何其他更改状态的函数)开始时将其设置为 false,并在函数的逻辑完成时将其设置回 true。然后让你的 handleSubmit 函数在调度提交逻辑之前检查可提交状态是否为真 -
只有在
setState之后使用this.state时才会出现您的问题。在盗版中,状态会在用户触发onClick事件时更新。如果你想立即使用state,你总是可以async handleChange方法然后await setState,但我认为这里没有必要。 -
谢谢大家! EgorEgorov - 不确定当用户填写所有值时禁用提交按钮是否有意义。 MEnf - 有多个句柄更改...... FisNan - onClick 之前所有状态更新的任何保证?