码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • React Hooks批量更新问题


    React  版本17.0.2

    1. import React, { useState } from 'react';
    2. const Demo = () => {
    3. const [count, setCount] = useState(0);
    4. const [count1, setCount1] = useState(0);
    5. const [count2, setCount2] = useState(0);
    6. console.log('===Demo==');
    7. const add = async () => {
    8. await 10;
    9. setCount(count + 1);
    10. setCount1(count1 + 1);
    11. setCount2(count2 + 1);
    12. };
    13. return (
    14. <div>
    15. <div onClick={add}>buttondiv>
    16. <div>{count}div>
    17. <div>{count1}div>
    18. <div>{count2}div>
    19. div>
    20. );
    21. };
    22. export default Demo;

    每次点击button ,log会执行3次,当我们把async方法里面的await去掉,让他变成正常方法,那么点击button就会执行一次。

    同样代码在React 版本18.2.0时候点击button,log只会打印一次。

    再次修改代码对同一个状态同时执行多次更改

    1. import React, { useState } from 'react';
    2. const Demo = () => {
    3. const [count, setCount] = useState(0);
    4. console.log('===Demo==');
    5. const add = async () => {
    6. await 10;
    7. setCount(count + 1);
    8. setCount(count + 1);
    9. setCount(count + 1);
    10. setCount(count + 1);
    11. setCount(count + 1);
    12. setCount(count + 1);
    13. };
    14. return (
    15. <div>
    16. <div onClick={add}>buttondiv>
    17. <div>{count}div>
    18. div>
    19. );
    20. };
    21. export default Demo;

    React 17.0.2 log会打次2次,也就是对于同一状态同时多次修改,那么React会合并一起更改,log打印两次是因为在开发环境下,会多执行一次。

    React18,还是只会打印一次log。

    总结:

    React 17.0.2 在异步方法中,多个状态同时修改会造成页面刷新多次,同一状态同时多次修改页面只会刷新一次

    React 18 默认在异步方法中开启了批量更新没有问题。

    React 17.0.2解决方案:使用unstable_batchedUpdates

    1. import React, { useState } from 'react';
    2. import { unstable_batchedUpdates } from 'react-dom'; // 批量更新状态时使用
    3. const Demo = () => {
    4. const [count, setCount] = useState(0);
    5. const [count1, setCount1] = useState(0);
    6. const [count2, setCount2] = useState(0);
    7. console.log('===Demo==');
    8. const add = async () => {
    9. await 10;
    10. unstable_batchedUpdates(() => {
    11. setCount(count + 1);
    12. setCount1(count1 + 1);
    13. setCount2(count2 + 1);
    14. });
    15. };
    16. return (
    17. <div>
    18. <div onClick={add}>buttondiv>
    19. <div>{count}div>
    20. <div>{count1}div>
    21. <div>{count2}div>
    22. div>
    23. );
    24. };
    25. export default Demo;

    log只会打印一次

    推广一下自己开发的微信小程序,有兴趣的朋友可以玩一玩

  • 相关阅读:
    【JVM技术专题】「源码专题」深入剖析JVM的Mutex锁的运行原理及源码实现(底层原理-防面试)
    【Java 基础篇】Java JUnit 使用详解
    数据库系统原理与应用教程(073)—— MySQL 练习题:操作题 131-140(十七):综合练习
    python代码混淆与代码打包
    Java+JSP+MySQL基于SSM的会议交接平台的设计与实现-计算机毕业设计
    第09章 MyBatisPlus实现查询功能
    【每日一题Day33】LC799香槟塔 | 动态规划
    基于单片机的纸牌24点游戏模拟器设计
    分布式与一致性协议之CAP(三)
    DHCPsnooping 配置实验(2)
  • 原文地址:https://blog.csdn.net/qq_33715850/article/details/133920857
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号