当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/199716.html

相关文章:

  • 竞赛 深度学习YOLO抽烟行为检测 - python opencv
  • cAdvisor监控Docker容器做性能测试
  • 记一次EDU证书站
  • React高频面试题100+题,这一篇就够了!
  • mysql MVC jsp实现表分页
  • 【微信小程序】数字化会议OA系统之首页搭建(附源码)
  • Leetcode——二维数组及滚动数组练习
  • 钢水包升降翻转液压系统比例阀放大器
  • 通达OA-通用版-V12,流程及表单自定义好用的类
  • 如何在vue中实现图片懒加载
  • Mac 远程桌面软件
  • EPLAN_005#宏边框、页宏、窗口宏/符号宏
  • 如何正确地使用ChatGPT(角色扮演+提示工程)
  • MySQL服务安装与登录
  • 论文阅读之《Kindling the Darkness: A Practical Low-light Image Enhancer》
  • 性能测试基础知识及性能指标
  • ArcGIS笔记10_如何创建渔网?
  • Jmeter安装(快速入门)
  • 一个react前端项目中的配置文件作用解析
  • MAC 配置 Maven
  • vue3.0 + element plus upload图片 上传
  • Leetcode 18:四数之和
  • word误删除的文件怎么恢复?恢复办法分享
  • 提高Qt开发软件运算性能提升
  • WordPress SMTP邮件发送插件 Easy WP SMTP
  • 大咖云集,智慧碰撞|第 18 届 CLK 大会完整议程揭晓(内附报名通道)
  • springweb+vue前后端分离开发,集成部署
  • 美芯片禁令再次扩大,波及英伟达、AMD以及intel等科技公司 | 百能云芯
  • Docker入门到精通教程
  • Java 对象是什么样子的?