• 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只会打印一次

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

  • 相关阅读:
    简单题-单词分析
    QT之可自由折叠和展开的布局
    HCIP--BGP基础实验
    Deep Learning相关概念介绍
    菜品识别易语言代码
    网课查题接口 微信公众号一步授权即可
    HECTF2022 学习笔记
    A-Level Physics真题及答案解析
    MySQL InnoDB 锁
    如何使用Abaqus进行跌落仿真
  • 原文地址:https://blog.csdn.net/qq_33715850/article/details/133920857