ReactHook使用useState更新变量后,如何拿到变量更新后的值

 更新时间:2024年03月13日 09:41:38   作者:wen_文文  
这篇文章主要介绍了ReactHook使用useState更新变量后,如何拿到变量更新后的值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

ReactHook使用useState更新变量后,如何拿到变量更新后的值

场景

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

在setCount() 更新变量的值后,立即调用某个函数query,在函数中需要读取到这个变量的新值;但是此时直接调用的话拿到的是旧值; 

为什么变量更新后不能立即拿到新值? 

因为setCount 函数用于更新 count值。

它接收一个新的 count 值并将组件的一次重新渲染加入队列中,在组件的重新渲染中,

useState()返回的第一个值始终是count更新后的新值,所以如果组件还未重新渲染就直接读取count变量的话,

拿到的就是未更新的旧值;

const UseState = () => {
  // 函数组件中没有this
  const [count, setCount] = useState(0)
 
  const add = () => {
    let newCount = count
    console.log('value1', count);  // 0
    setCount( newCount+= 1)
    console.log('value2', count);  // 0
    query() 
  }
 
  const query = () => {
    console.log('query函数中:', count);  // 0
  }
  return (
    <div>
      <p>{count}</p>
      <button onClick={add} >增加</button>
    </div>
  )
}

打印结果:

解决方法

1)可以将count的新值通过函数传参的方式传入query函数;

// 改写add和query函数;
 
const add = () => {
    let newCount = count
    console.log('value1', count);
    setCount( newCount+= 1)
    console.log('value2', count);
    query(newCount)   
 }
 const query = (count) => {
    console.log('query函数中:', count);
 }

打印结果: 

2)在useEffect中调用query函数,因为在useEffect中,组件dom已经更新完毕,可以拿到count的最新值;

(缺点:每次count值改变,都会触发useEffect,从而执行query函数;)

  // 组件每次渲染之后执行的操作,执行该操作时dom都已经更新完毕
  useEffect(()=>{
    // 1、可在此处拿到count更新后的值
    console.log('value3', count);
    query()
  }, [count])
 
  const add = () => {
    let newCount = count
    console.log('value1', count);
    setCount( newCount+= 1)
    console.log('value2', count);
  }
 const query = () => { 
   console.log('query函数中:', count);
 }

打印结果: 

3)通过useRef()定义一个可变的ref变量,通过current属性保存count可变值,从而在count更新后,通过ref的current属性拿到更新后的count值;

注意:调用query函数时需要加上setTimeout()进行调用;

// 定义一个可变的countRef对象,该对象的current属性被初始化为传入的参数count;
const countRef = useRef(count)
 
// 在countRef.current属性中保存一个可变值count的盒子;
countRef.current = count
 
const add = () => {
   let newCount = count
   console.log('value1', count);
   setCount( newCount+= 1)
   console.log('value2', count);
   setTimeout(() => query(), 0);
}
 
const query = () => {
   console.log('query函数中:', countRef.current);
}

打印结果: 

 

总结

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

相关文章

  • React中使用Axios发起POST请求提交文件方式

    React中使用Axios发起POST请求提交文件方式

    这篇文章主要介绍了React中使用Axios发起POST请求提交文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • React在Dva项目中创建并引用页面局部组件的方式

    React在Dva项目中创建并引用页面局部组件的方式

    这篇文章主要介绍了React在Dva项目中创建并引用页面局部组件的方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 详解React Angular Vue三大前端技术

    详解React Angular Vue三大前端技术

    当前世界中,技术发展非常迅速并且变化迅速,开发者需要更多的开发工具来解决不同的问题。本文就对于当下主流的前端开发技术React、Vue、Angular这三个框架做个相对详尽的探究,目的是为了解开这些前端技术的面纱,看看各自的庐山真面目。
    2021-05-05
  • React内部实现cache方法示例详解

    React内部实现cache方法示例详解

    这篇文章主要为大家介绍了React内部实现cache方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • ReactNative实现的横向滑动条效果

    ReactNative实现的横向滑动条效果

    本文介绍了ReactNative实现的横向滑动条效果,本文结合示例代码给大家介绍的非常详细,补充介绍了ReactNative基于宽度变化实现的动画效果,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • 解决React报错Invalid hook call

    解决React报错Invalid hook call

    这篇文章主要为大家介绍了React报错Invalid hook call解决方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • React Router 5.1.0使用useHistory做页面跳转导航的实现

    React Router 5.1.0使用useHistory做页面跳转导航的实现

    本文主要介绍了React Router 5.1.0使用useHistory做页面跳转导航的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • React使用api的方式封装弹窗的示例代码

    React使用api的方式封装弹窗的示例代码

    在现代开发中的弹窗样式,经常会是底部一个叉号样式的弹窗,但是目前组件库中并无类似弹窗组件,本文小编给大家介绍了React使用api的方式封装弹窗的示例,感兴趣的小伙伴跟着小编一起来看看吧
    2024-09-09
  • React封装弹出框组件的方法

    React封装弹出框组件的方法

    这篇文章主要为大家详细介绍了React封装弹出框组件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 一文详解React如何处理表单的复杂验证逻辑

    一文详解React如何处理表单的复杂验证逻辑

    这篇文章主要为大家详细介绍了React中如何处理表单的复杂验证逻辑,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-03-03

最新评论