第 19 题:React setState 笔试题,下面的代码输出什么?
js
class Example extends React.Component {
constructor() {
super();
this.state = {
val: 0
};
}
componentDidMount() {
this.setState({
val: this.state.val + 1
});
console.log(this.state.val); // 第 1 次 log
this.setState({
val: this.state.val + 1
});
console.log(this.state.val); // 第 2 次 log
setTimeout(() => {
this.setState({
val: this.state.val + 1
});
console.log(this.state.val); // 第 3 次 log
this.setState({
val: this.state.val + 1
});
console.log(this.state.val); // 第 4 次 log
}, 0);
}
render() {
return null;
}
}
分析
- 第一次和第二次都是在
react
自身生命周期内,触发时isBatchingUpdates
为true
,所以并不会直接执行更新state
,而是加入了dirtyComponents
,所以打印时获取的都是更新前的状态0
。 - 两次
setState
时,获取到this.state.val
都是0
,所以执行时都是将0
设置成1
,在react
内部会被合并掉,只执行一次。设置完成后state.val
值为1
。 setTimeout
中的代码,触发时isBatchingUpdates
为false
,所以能够直接进行更新,所以连着输出2
,3
。
输出:0 0 2 3