setState调用后,React会执行一个事务(Transaction),在这个事务中,React将新state放进一个队列中,当事务完成后,React就会刷新队列,然后启动另一个事务,这个事务包括执行 shouldComponentUpdate 方法来判断是否重新渲染,如果是,React就会进行state合并(state merge),生成新的state和props;如果不是,React仍然会更新this.state,只不过不会再render了。
...
constructor(props) {
super(props)
this.state = {
val: 0
}
}
componentDidMount() {
this.setState({val: this.state.val + 1});
console.log("componentDidMount:"+this.state.val);
this.setState({val: this.state.val + 1});
console.log("componentDidMount:"+this.state.val);
this.setState({val: this.state.val + 1});
console.log("componentDidMount:"+this.state.val);
setTimeout(() => {
this.setState({val: this.state.val + 1});
console.log("componentDidMount setTimeout:"+this.state.val);
this.setState({val: this.state.val + 1});
console.log("componentDidMount setTimeout:"+this.state.val);
})
}
componentDidUpdate() {
console.log("componentDidUpdate:"+this.state.val);
}
...
// 结果
componentDidMount:0
componentDidMount:0
componentDidMount:0
componentDidUpdate:1
componentDidUpdate:2
componentDidMount setTimeout:2
componentDidUpdate:3
componentDidMount setTimeout:3