React setState回调执行序列
React setState callback execution sequence
var SubOne = React.createClass({
getInitialState(){
return {
current : 0
};
},
render() {
var that = this;
var list = [
1111,2222,3333,444
];
var createItem = function(itemText, index) {
return <li key={index} data-index={index} onClick={that._handleClick}>{itemText}</li>;
};
return <ul ref="list">{list.map(createItem)}</ul>;
},
componentDidMount(){
var that = this;
setTimeout(function(){
that._handleClick();
}, 2000);
},
_handleClick(){
console.log("before setState");
this.setState({
current : 0
},function(){
console.log("setState callback");
});
console.log("after setState");
}
});
React.render(<SubOne />, document.getElementById("example"));
结果是:
setTimeout电话:
设置状态设置状态回调设置状态后
onclick电话:
设置状态设置状态后设置状态回调
为什么执行顺序不同?
这与React的批处理更新机制有关。我在这个话题上不是很强,所以我不能给你一个明确的答案,但也许这里的讨论会给你一些启示:)https://groups.google.com/forum/!主题/reactjs LkTihnf6Ey8
setState
是异步的。来自文档:
不能保证对
setState
的调用是同步的,为了提高性能,调用可能是批处理的。
因此,你只能安全地假设setState
回调将在状态发生变化后执行。
相关文章:
- 如何在`window.open`之后执行回调
- 带有Spring的$.getJSON未执行回调
- TypeError:执行回调时,回调不是函数
- Google API 的客户端库不会执行回调
- 调用消费方法后,如何在分配回调时执行回调
- 仅在堆栈中的最后一个执行回调
- 在组合框筛选后执行回调网格视图
- 在循环完成 nodejs 请求之前执行回调
- 通过AjaxForm提交图像并执行回调
- 无法在模块中执行回调,使用 Node-Cron导出对象
- 使用递归函数按顺序执行多个 ajax 请求,并在所有请求完成后执行回调函数
- 如何从对象构造函数执行回调
- 在 modernizr/yepnope 加载完所有文件后执行回调
- 在节点中执行回调
- Javascript 数组映射“出现”以对缺少的元素执行回调
- 如何在调用它的函数结束时执行回调
- 对多个元素执行回调函数
- JavaScript原生Promise对两个结果执行回调
- jquery中未执行回调函数
- 如何在循环中的所有AJAX请求完成后执行回调