React Hooks批量更新问题

React  版本17.0.2

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值