React setState 笔试题,下面的代码输出什么?
让我们详细分析一下这个 React 代码示例,以确定它在控制台中的输出结果。
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;
}
};
代码分析
componentDidMount
方法调用setState
两次 :this.setState({val: this.state.val + 1});
会触发一个状态更新。- 由于
setState
是异步的,React 会将这两次状态更新合并(批量更新)为一次状态更新。因此,val
的最终值在这两次调用后是1
(0 + 1
)。
console.log(this.state.val)
输出 :- 第 1 次 log : 在第一次
setState
调用后,状态还没有真正更新,所以它打印的是旧的状态值0
。 - 第 2 次 log : 在第二次
setState
调用后,状态依旧没有真正更新,所以它仍然打印的是旧的状态值0
。
- 第 1 次 log : 在第一次
setTimeout
的回调 :setTimeout
中的代码会在当前执行栈清空后异步执行。React 仍然会在这段时间内批量处理状态更新。- 在
setTimeout
中的setState
调用同样会被批量处理。最终状态值val
将增加2
(从1
增加到3
)。
console.log(this.state.val)
输出 :- 第 3 次 log : 在
setTimeout
回调中第一次setState
后,状态val
是2
(之前合并更新后的1
+ 1)。 - 第 4 次 log : 在
setTimeout
回调中第二次setState
后,状态val
是3
(之前的2
+ 1)。
- 第 3 次 log : 在
总结
输出顺序和结果如下:
- 第 1 次 log:
0
(第一次setState
调用前的状态) - 第 2 次 log:
0
(第二次setState
调用前的状态) - 第 3 次 log:
2
(setTimeout
回调中状态更新后的值) - 第 4 次 log:
3
(setTimeout
回调中第二次状态更新后的值)
所以,控制台输出的内容是:
0
0
2
3
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论