React Hooks批量更新问题

React 版本17.0.2

javascript 复制代码
import React, { useState } from 'react';

const Demo = () => {
    const [count, setCount] = useState(0);
    const [count1, setCount1] = useState(0);
    const [count2, setCount2] = useState(0);

    console.log('===Demo==');

    const add = async () => {
        await 10;
        setCount(count + 1);
        setCount1(count1 + 1);
        setCount2(count2 + 1);
    };

    return (
        <div>
            <div onClick={add}>button</div>
            <div>{count}</div>
            <div>{count1}</div>
            <div>{count2}</div>
        </div>
    );
};

export default Demo;

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

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

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

javascript 复制代码
import React, { useState } from 'react';

const Demo = () => {
    const [count, setCount] = useState(0);

    console.log('===Demo==');

    const add = async () => {
        await 10;
        setCount(count + 1);
        setCount(count + 1);
        setCount(count + 1);
        setCount(count + 1);
        setCount(count + 1);
        setCount(count + 1);
    };

    return (
        <div>
            <div onClick={add}>button</div>
            <div>{count}</div>
        </div>
    );
};

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

javascript 复制代码
import React, { useState } from 'react';
import { unstable_batchedUpdates } from 'react-dom'; // 批量更新状态时使用

const Demo = () => {
    const [count, setCount] = useState(0);
    const [count1, setCount1] = useState(0);
    const [count2, setCount2] = useState(0);

    console.log('===Demo==');

    const add = async () => {
        await 10;
        unstable_batchedUpdates(() => {
            setCount(count + 1);
            setCount1(count1 + 1);
            setCount2(count2 + 1);
        });
    };

    return (
        <div>
            <div onClick={add}>button</div>
            <div>{count}</div>
            <div>{count1}</div>
            <div>{count2}</div>
        </div>
    );
};

export default Demo;

log只会打印一次

相关推荐
zzqssliu5 小时前
跨境独立站多端适配开发:多语言+多货币+跨平台同步技术实战
前端·javascript·php
Chengbei115 小时前
AI赋能Chrome MCP × JS逆向Skill自动化JS逆向助力挖洞与绕过实战(小白也能学会)
javascript·人工智能·chrome·网络安全·自动化·系统安全·安全架构
怕浪猫5 小时前
Electron 开发实战(五):文件系统与本地数据持久化全解
前端·javascript·electron
云水一下5 小时前
HTML5 从入门到精通:语义为王——结构标签让网页会“说话”
前端·html5
Bigger5 小时前
mini-cc 的 Provider 抽象层是怎么设计的
前端·ai编程·claude
云水一下5 小时前
HTML5 从入门到精通:优化与扩展——资源加载、SEO 基础与无障碍入门
前端·html5
李白你好5 小时前
[特殊字符] XSS漏洞演示靶场 - 交互式XSS攻击演示平台,包含钓鱼攻击、Cookie窃取演示,适合安全教育教学
前端·安全·xss
JiaWen技术圈5 小时前
解析 React Composition Patterns
前端·react.js·前端框架
CoCo的编程之路5 小时前
像素级突围:如何利用智能前端开发助手最大化提升页面构建速度?
前端·人工智能·ai编程·智能编程助手·文心快码baiducomate
techdashen5 小时前
npm 生态遭遇供应链攻击:color 包被投毒,每周 3200 万次下载全部受影响
前端·npm·node.js