关于react hook useState连续更新对象的问题

 更新时间:2024年03月13日 09:03:09   作者:Bearbearssss  
这篇文章主要介绍了关于react hook useState连续更新对象的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

react hook useState连续更新对象

react hook 的useState更新是异步的,所以在连续更新出发useState时会出现问题

eg:

import React, {useState} from 'react';
 
export default () => {
    const [obj, setObj] = useState({
        a: 1,
        b: 2
      })
 
    const changeObj = () => {
        // 连续触发2次setObj(实际项目不会这样写,我这样写只是为了模拟连续触发2次setObj带来的问题)
        setObj({...obj, a: 2})
        setObj({...obj, b: 3}) 
    }
   return (<div onClick={changeObj}>
          // 此时页面上显示的值为 {a: 1, b: 3}, 出现该问题的原因是因为useState是异步的,在第二次触发setObj时,obj还是没更新a之前的obj,所以出现该结果
            {JSON.stringify(obj)}
           </div>)
}

解决此情况的方式

就是在第二次触发时使用

setObj((data) => ({...data, b: 3})) 

这样的方式

import React, {useState} from 'react';
 
export default () => {
    const [obj, setObj] = useState({
        a: 1,
        b: 2
      })
 
    const changeObj = () => {
        // 连续触发2次setObj(实际项目不会这样写,为了模拟情况)
        setObj({...obj, a: 2})
        // data标识存储的是更新a后的对象,用这样的方式可以解决连续触发2次带来的问题
        setObj((data) => ({...data, b: 3})) 
    }
   return (<div onClick={changeObj}>
          // 此时页面上显示的值为 {a: 2, b: 3}
            {JSON.stringify(obj)}
           </div>)
}

react hook使用useState()更新状态(state)异步导致不能及时读取更新之后的数据

场景描述

我在更新一个状态之后要立马用这个状态去更新其他状态

我的源代码

const onChange = (nextTargetKeys: any) => {
//更新状态
    setTargetKeys(nextTargetKeys);
    let v = 0;
    let n = 0;
    let g = 0;
    //立马使用
   targetKeys.forEach((item: number, index) => {
      v += mockData[item].itemVolume;
      n += mockData[item].itemNw;
      g += mockData[item].itemGw;
    });
       setTopData({ v: Number((v/1000000).toFixed(4)), n: n, g: g });
  };

如果是vue,这里是没有问题的 ,但是这是react~这里的数据还没更新,取到的还是旧数据

这里加个setTimeout延迟执行就是新的数据。这是为什么了?

原因:

vue是同步更新状态,异步视图,当状态变化是阻塞更新完成之后执行后继逻辑,

react是异步更新状态,setState 是异步方法,所以不会阻塞!

处理办法

添加一个 副作用(useEffect()

  useEffect(()=>{
    let v = 0;
    let n = 0;
    let g = 0;
    targetKeys.forEach((item: number, index) => {
      v += mockData[item].itemVolume;
      n += mockData[item].itemNw;
      g += mockData[item].itemGw;
      console.log(v)
    });
    setTopData({ v: Number((v/1000000).toFixed(4)), n: n, g: g });
     },[targetKeys])

顺便发表感受,还是vue的状态更新直接、简便!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持程序员之家。 

相关文章

  • 详解React中共享组件逻辑的三种方式

    详解React中共享组件逻辑的三种方式

    这篇文章主要介绍了详解React中共享组件逻辑的三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • react:swr接口缓存案例代码

    react:swr接口缓存案例代码

    useSWR 是一个 React Hooks,是 HTTP 缓存库 SWR 的核心方法之一,SWR 是一个轻量级的 React Hooks 库,通过自动缓存数据来实现 React 的数据获取,本文给大家介绍react:swr接口缓存案例详解,感兴趣的朋友一起看看吧
    2023-11-11
  • React Hooks之useRef获取元素示例详解

    React Hooks之useRef获取元素示例详解

    这篇文章主要介绍了React Hooks之useRef获取元素示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Remix中mdx?table不支持表格解决

    Remix中mdx?table不支持表格解决

    这篇文章主要为大家介绍了Remix中mdx?table不支持表格问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • React中实现插槽效果的方案详解

    React中实现插槽效果的方案详解

    在React中是没有插槽的概念的, 或者说在React中是不需要插槽的, 因为React对于这种需要插槽的情况非常灵活,本文给大家分享两种方案实现,分别是children实现插槽和props实现插槽,结合实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-09-09
  • 在React中应用SOLID原则的方法

    在React中应用SOLID原则的方法

    SOLID?是一套原则,它们主要是关心代码质量和可维护性的软件专业人员的指导方针,本文给大家分享如何在React中应用SOLID原则,感兴趣的朋友一起看看吧
    2022-07-07
  • React组件生命周期详解

    React组件生命周期详解

    本篇文章主要介绍了React组件生命周期,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • React之使用useState异步刷新的问题

    React之使用useState异步刷新的问题

    这篇文章主要介绍了React之使用useState异步刷新的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • React?SSR?中的限流案例详解

    React?SSR?中的限流案例详解

    这篇文章主要介绍了React?SSR?之限流,React SSR 毕竟涉及到了服务端,有很多服务端特有的问题需要考虑,而限流就是其中之一,本文会通过一个简单的案例来说明,为什么服务端需要进行限流,需要的朋友可以参考下
    2022-07-07
  • React实现类似于Vue中的插槽的项目实践

    React实现类似于Vue中的插槽的项目实践

    本文主要介绍了React实现类似于Vue中的插槽的项目实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05

最新评论


http://www.vxiaotou.com