我正在尝试在用户更新Child
组件的select
元素的值 * 之后 * 更新Parent
组件的状态。
虽然我已经让它工作了一些,但我注意到当我在select
上触发onChange
事件时,它总是返回 previous 值,而不是刚刚选择的值。
class Parent extends Component{
constructor(props){
super(props);
this.state = { data: {
condition: "any"
}};
}
update = data => {
this.setState({ data: {
...this.state.data,
...data
}});
// This gets called every time I change the value of my select element.
console.log(this.state.data);
}
render(){
return (
<Child
condition={this.state.data.condition}
onUpdate={data => this.update(data)} />
);
}
}
class Child extends Component{
updateParent = data => {
this.props.onUpdate(data);
}
render(){
const options = [
["any", "Any Condition"],
["new", "Brand New"],
["used", "Used"]
];
return (
<select
defaultValue={ props.selected }
onChange={({ target }) => this.updateParent({ condition: target.value })}>
{ options.map(([id, name]) => (
<option key={id} value={id}>{ name }</option>
)}
</select>
);
}
}
在本例中,如果我选择used
,控制台将返回any
。然后,如果我选择new
,控制台将返回used
。
1条答案
按热度按时间dwbf0jvd1#
setState
操作本质上是异步的,因此,无论何时完成setState操作,都不能保证在setState
语句之后就可以获得状态的更新值来自React单据
React可以将多个setState()调用批量处理为单个更新,以提高性能。
因为this.props和this.state可能会异步更新,所以不应该依赖它们的值来计算下一个状态。
现在,如果您想使用新的state值,您应该将该值(在本例中为
data
)存储在一个变量中,设置您的state,但要使用该变量在函数内部执行其他操作,如调用API等。编辑(正如@Grover所指出的):
setState
还提供了第二个参数,这是一个回调函数,在更新操作发生后被触发,用户可以在其中获取更新后的状态值,并使用它来执行更新后的值的操作。但是React文档建议使用componentDidUpdate而不是setState回调,这个答案试图解释原因:What is the advantage of using componentDidUpdate over the setState callback?