React setState 笔试题,下面的代码输出什么?

发布于 2024-10-26 18:24:17 字数 2518 浏览 3 评论 0

让我们详细分析一下这个 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;
    }
};

代码分析

  1. componentDidMount 方法调用 setState 两次 :
    • this.setState({val: this.state.val + 1}); 会触发一个状态更新。
    • 由于 setState 是异步的,React 会将这两次状态更新合并(批量更新)为一次状态更新。因此, val 的最终值在这两次调用后是 10 + 1 )。
  2. console.log(this.state.val) 输出 :
    • 第 1 次 log : 在第一次 setState 调用后,状态还没有真正更新,所以它打印的是旧的状态值 0
    • 第 2 次 log : 在第二次 setState 调用后,状态依旧没有真正更新,所以它仍然打印的是旧的状态值 0
  3. setTimeout 的回调 :
    • setTimeout 中的代码会在当前执行栈清空后异步执行。React 仍然会在这段时间内批量处理状态更新。
    • setTimeout 中的 setState 调用同样会被批量处理。最终状态值 val 将增加 2 (从 1 增加到 3 )。
  4. console.log(this.state.val) 输出 :
    • 第 3 次 log : 在 setTimeout 回调中第一次 setState 后,状态 val2 (之前合并更新后的 1 + 1)。
    • 第 4 次 log : 在 setTimeout 回调中第二次 setState 后,状态 val3 (之前的 2 + 1)。

总结

输出顺序和结果如下:

  1. 第 1 次 log: 0 (第一次 setState 调用前的状态)
  2. 第 2 次 log: 0 (第二次 setState 调用前的状态)
  3. 第 3 次 log: 2setTimeout 回调中状态更新后的值)
  4. 第 4 次 log: 3setTimeout 回调中第二次状态更新后的值)

所以,控制台输出的内容是:

0
0
2
3

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

linfzu01

文章 0 评论 0

可遇━不可求

文章 0 评论 0

枕梦

文章 0 评论 0

qq_3LFa8Q

文章 0 评论 0

JP

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文