React中两个setState调用次数是多少,调用是哪�

Admin 2022-07-06 群英技术资�

今天这篇给大家分享的知识是“React中两个setState调用次数是多少,调用是哪个�,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,对此分享发大家做个参考,希望这篇“React中两个setState调用次数是多少,调用是哪个”文章能帮助大家解决问题�



   
1. 两个setState,调用几次?

如下代码所示,state中有一�count。对按钮绑定了点击事件,事件中执行了两次setState,每次都�count的值加1

当点击按钮时�setState会执行几次?render()会执行几次?

答案:都�1次�

state = { count: 0 };
handleClick = () => {
    this.setState({ count: this.state.count + 1 });
    this.setState({ count: this.state.count + 1 });
};
render() {
    console.log(`render`);
    return (
        <>
            <div>当前计数:{this.state.count}</div>
            <button onClick={this.handleClick}>add</button>
        </>
    );
}

按照常理来说,第一次点击按钮时,由于执行了两次两次setState,每次都�count的值进行加1render()应该会执行两次,最�count的值应该是2。但� React 并不是这么执行的�

以上代码放到浏览器运行一下即可:

最开始时,页面显�count的值为0,控制台打印�render,这� React 首次渲染时打印的。当点击完按钮后,页面显�count值是1,同时也只打印了1render,说明在这过程中 React 只执行了一�setState,只执行了一�render()渲染操作�

原因在于,React 内部�同一事件响应函数中的多个setState进行合并,减�setState的调用次数,也就能减少渲染的次数,提高性能�

这也就解释了上述代码,为什么最�count的值是1,因� React 将两�setState进行了合并,最终只执行�1次,render()也只执行了一次�

2. 两个setState,调用的是哪一个?

但上述代码没有验证,React 合并后,到底执行的是哪一�setState。如下代码所示,将第二个setState中,�count的操作改为加2,其余代码保持不变:

state = { count: 0 };
handleClick = () => {
    this.setState({ count: this.state.count + 1 });
    this.setState({ count: this.state.count + 2 }); // 改为+2
};
render() {
    console.log(`render`);
    return (
        <>
            <div>当前计数:{this.state.count}</div>
            <button onClick={this.handleClick}>add</button>
        </>
    );
}

再次放到浏览器中执行�

结果显示,点击按钮后�count的值最终变成了2,也就是进行�+2的操作,render()也只执行�1次。这就说� React 在合并多�setState时,若出现同名属性,会将后面的同名属�覆盖�前面的同名属�。可以这么理解,对于同名属性,最终执行的的是最�setState中的属性�

3. 两个setState放在setTimeout中?

若在点击事件函数中,添加一个定时器setTimeout,在定时器中执行两次setState操作,结果又将如何?如下代码,事件处理函数中,写了一个定时器setTimeout,将两次setState放入setTimeout中�

state = { count: 0 };
handleClick = () => {
    setTimeout(() => {
        this.setState({ count: this.state.count + 1 });
        this.setState({ count: this.state.count + 2 });
    }, 0);
};
render() {
    console.log(`render`);
    return (
        <>
            <div>当前计数:{this.state.count}</div>
            <button onClick={this.handleClick}>add</button>
        </>
    );
}

运行结果�

结果显示,点击按钮后�count的值最终变成了3,也�+1+2的操作都执行了,render()也执行了2次�

这是因为� React �合成事件生命周期函数中直接调�setState,会交由 React �性能优化机制管理,合并多�setState。而在原生事件setTimeout中调�setState,是不受 React 管理的,故并不会合并多个setState,写了几�setState,就会调用几�setState

4. 总结

� React 中直接使用的事件,如onChangeonClick等,都是� React 封装后的事件,是合成事件,由 React 管理�

React 对于合成事件和生命周期函数,有一�性能优化机制,会合并多个setState,若出现同名属性,会将后面的同名属�覆盖�前面的同名属�

若越� React �性能优化机制,在原生事件setTimeout中使�setState,就不归 React 管理了,写了几次setState,就会调用几�setState


现在大家对于React中两个setState调用次数是多少,调用是哪个的内容应该都有一定的认识了吧,希望这篇能对大家有所帮助。最后,想要了解更多,欢迎关注群英网络,群英网络将为大家推送更多相关的文章�
标签� setState调用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:[email protected]进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容�

猜你喜欢

成为群英会员,开启智能安全云计算之旅

立即注册
专业资深工程师驻�
7X24小时快速响�
一站式无忧技术支�
免费备案服务
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 � 0668-2555555
在线客服
微信公众号
返回顶部
返回顶部 返回顶部