React hooks useState异步问题及解决

 更新时间:2022年08月05日 11:31:46   作者:冬天爱吃烤肉  
这篇文章主要介绍了React hooks useState异步问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

React Hooks useState异步问题

最近在开发中遇到一个问题 我接口请求回来的数据 用useState存储起来。

但是我后面 去改变这个数据的时候每次拿到都是上次的数据没办法及时更新。

原因

useState 返回的更新状态方法是异步的,要在下次重绘才能获取新值。不要试图在更改状态之后立马获取状态。

解决方法

应该使用useRef 存储这个数据,在useEffect里监听data的变化

const dataRef = useRef()
const [data,setData] = useState[{}]
useEffect(() => {
     dataRef.current =   data
}, [data])

当我们想使用当前的数据的时候直接用dataRef.current 获取的就是当前最新的数据

console.log(dataRef.current)//最新的数据

React中useState异步更新小坑

问题

在hooks中,修改状态的是通过useState返回的修改函数实现的.它的功能类似于class组件中的this.setState().而且,这两种方式都是异步的.可是this.setState()是有回调函数的,那useState()呢?

问题点

它异步且没有回调函数

const [count,setCount] = useState(1)
useEffect(()=> {
    setCount(2,()=>{
      console.log('测试hooks的回调');
    })
    console.log(count);
  },[])

打印信息

可以看到提示 “State updates from the useState() and useReducer() Hooks don’t support the second callback argument. To execute a side effect after rendering, declare it in the component body with useEffect().”

是不支持回调函数的形式的。因为setCount是异步的,所以打印count是在改变count之前的。

如果我们想要在打印的时候就拿到最新的值,那么我们可以通过setCount的第二个参数指定依赖项

const [count,setCount] = useState(1)
useEffect(()=> {
    setCount(2)
    console.log(count);
  },[count])

当count发生变化的时候,useEffect就会再次相应,但是这样就会有个问题,当count从1变为2的时候useEffect的回调函数会再次执行,就会分别打印1,2两次。

  useEffect(()=> {
    let currentValue = null
      setCount((preVal)=>{
        currentValue=preVal
        return 2
      })
      if(currentValue!==count){
        console.log(count);
      }
    },[count])

通过添加判断条件,我们可以让想要执行的代码只执行一次

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

相关文章

  • React实现文件分片上传和下载的方法详解

    React实现文件分片上传和下载的方法详解

    在当今的前端开发中,处理文件流操作已经成为一个常见的需求,无论是上传、下载、读取、展示还是其他的文件处理操作,都需要高效且可靠地处理二进制数据,本文将深入探讨如何使用 React 实现文件分片上传和下载,并介绍相关的基本概念和技术,需要的朋友可以参考下
    2023-08-08
  • React Draggable插件如何实现拖拽功能

    React Draggable插件如何实现拖拽功能

    这篇文章主要介绍了React Draggable插件如何实现拖拽功能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 利用React实现虚拟列表的示例代码

    利用React实现虚拟列表的示例代码

    虚拟列表,其实就是将一个原本需要全部列表项的渲染的长列表,改为只渲染可视区域内的列表项,但滚动效果还是要和渲染所有列表项的长列表一样。本文就将利用React实现虚拟列表,需要的可以参考一下
    2022-08-08
  • React生命周期原理与用法踩坑笔记

    React生命周期原理与用法踩坑笔记

    这篇文章主要介绍了React生命周期原理与用法,结合实例形式总结分析了react生命周期原理、用法及相关注意事项,需要的朋友可以参考下
    2020-04-04
  • JavaScript中rem布局在react中的应用

    JavaScript中rem布局在react中的应用

    这篇文章主要介绍了JavaScript中rem布局在react中的应用 的相关资料,需要的朋友可以参考下
    2015-12-12
  • React+Mobx基本使用、模块化操作

    React+Mobx基本使用、模块化操作

    React 和 MobX 是一对强力组合,React 通过提供机制把应用状态转换为可渲染组件树并对其进行渲染,而MobX提供机制来存储和更新应用状态供 React 使用,这篇文章主要介绍了React+Mobx基本使用、模块化,需要的朋友可以参考下
    2022-09-09
  • React项目仿小红书首页保姆级实战教程

    React项目仿小红书首页保姆级实战教程

    React 是一个用于构建用户界面的 Javascript库,接下来将通过实战小红书首页的详细介绍其设计思路和方法,将读者带入到react的开源世界,需要的朋友可以参考下
    2022-07-07
  • React 中如何将CSS visibility 属性设置为 hidden

    React 中如何将CSS visibility 属性设置为 hidden

    这篇文章主要介绍了React中如何将CSS visibility属性设置为 hidden,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 浅谈React中的元素、组件、实例和节点

    浅谈React中的元素、组件、实例和节点

    这篇文章主要介绍了浅谈React中的元素、组件、实例和节点,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • react MPA 多页配置详解

    react MPA 多页配置详解

    这篇文章主要介绍了react MPA 多页配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10

最新评论