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 (
    

{count}

) }

 打印结果:

 

 解决方法:

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);
 }

打印结果: 

ReactHook中使用useState更新变量后,怎么拿到变量更新后的值_第1张图片

 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);
 }

打印结果: 

ReactHook中使用useState更新变量后,怎么拿到变量更新后的值_第2张图片

 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);
}

打印结果: 

 ReactHook中使用useState更新变量后,怎么拿到变量更新后的值_第3张图片

你可能感兴趣的:(React,javascript,前端,servlet)