我正在阅读reactjs文档的表单部分,只是尝试了这段代码来演示onChange的用法(JSBIN)。
var React= require('react');
var ControlledForm= React.createClass({
getInitialState: function() {
return {
value: "initial value"
};
},
handleChange: function(event) {
console.log(this.state.value);
this.setState({value: event.target.value});
console.log(this.state.value);
},
render: function() {
return (
<input type="text" value={this.state.value} onChange={this.handleChange}/>
);
}
});
React.render(
<ControlledForm/>,
document.getElementById('mount')
);
当我在浏览器中更新<input/>值时,handleChange回调中的第二个console.log打印与第一个console.log相同的值,为什么我看不到这个结果。setState({value: event.target.value})在handleChange回调的范围?
简单地说,就是这个。setState({data: value})是异步的
这意味着它会移出调用堆栈,只会返回
到调用堆栈,除非它被解析。
请阅读事件循环,以清楚地了解JS中的异步性质,以及为什么需要时间来更新-
https://medium.com/front-end-weekly/javascript-event-loop-explained-4cd26af121d4
因此,
this.setState({data:value});
console.log(this.state.data); // will give undefined or unupdated value
因为更新需要时间。
实现上述过程-
this.setState({data:value},function () {
console.log(this.state.data);
});
正如React文档中提到的,没有保证setState被同步触发,所以你的console.log可能会在更新之前返回状态。
Michael Parker提到在setState中传递一个回调。另一种处理状态改变后逻辑的方法是通过componentDidUpdate生命周期方法,这是React文档中推荐的方法。
通常,我们建议对这种逻辑使用componentDidUpdate()。
当可能连续触发了setStates,并且您希望在每次状态更改后都触发相同的函数时,这特别有用。您可以将函数放置在componentDidUpdate中,而不是向每个setState添加回调,如果需要的话,在其中使用特定的逻辑。
// example
componentDidUpdate(prevProps, prevState) {
if (this.state.value > prevState.value) {
this.foo();
}
}
简单地说,就是这个。setState({data: value})是异步的
这意味着它会移出调用堆栈,只会返回
到调用堆栈,除非它被解析。
请阅读事件循环,以清楚地了解JS中的异步性质,以及为什么需要时间来更新-
https://medium.com/front-end-weekly/javascript-event-loop-explained-4cd26af121d4
因此,
this.setState({data:value});
console.log(this.state.data); // will give undefined or unupdated value
因为更新需要时间。
实现上述过程-
this.setState({data:value},function () {
console.log(this.state.data);
});