React在定时器中无法获取状态最新值的问题

 更新时间:2022年08月08日 14:46:45   作者:前端常春藤  
这篇文章主要介绍了React在定时器中无法获取状态最新值的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

在定时器中无法获取状态最新值

在做轮播图组件时发现了一个问题,在setInterval中无法通过状态直接获取最新值,如:

const [rightTransform, setRightTransform] = useState(pictureSize);

const autoPlay = () => {        //普通轮播自动播放
    timer.current = setInterval(() => {
      let oldState = rightTransform;
      console.log('老状态', oldState)			//始终只会打印初始的pictureSize
      setRightTransform(o => {
        const newState = JSON.parse(JSON.stringify(o));
        return newState >= (renderImgList.length) * pictureSize ? 0 : newState + pictureSize
      })
	}, 1000);
}

问题原因

定时器一直都没有被清除,因此获取的状态始终是定时器被创建时候的状态。

问题解决

从代码和图片可以看到,定时器中打印的状态永远都是初始值,后面所改变的值虽然更新了,页面也发生了变化,但是我们从log中无法获取到实时状态。

解决办法很简单:

第一种,就是在setState中获取上一次状态,因为useState hooks提供了记录上一次状态的缓存回调,可以在这个回调中获取上一轮状态

如图:

timer.current = setInterval(() => {
      let oldState = rightTransform;
      setRightTransform(o => {
        console.log('在setState中的老状态', o)
        const newState = JSON.parse(JSON.stringify(o));
        return newState >= (renderImgList.length) * pictureSize ? 0 : newState + pictureSize
      })
      console.log('直接打印老状态', oldState)
}

ReactHook hooks和定时器产生的bug

问题1

使用定时器改变state,state的值并不是最新值

例:

 const _onClick = function ()
 {
   setInterval(() => {
     console.log(value);
     setValue(value + 1);
   },1000)
 }

产生原因:因为每次setValue后会重新创建函数,由于并没有及时清理掉setInterval,setInterval执行的上下文环境都是第一次创建本函数式组件的上下文(所以value值不会超过1)

解决方案        

方案一:

setInterval(() => {
     console.log(value);
     setValue(v=>v+1);      函数式的setValue会保存上一次的值,所以会取得最新值,该方式指定state该如何改变而不用引用当前state
   },1000)

    

方案二:

useEffect(() => {
     const id = setInterval(() => {
         valf.current++;    不一定是ref操作,正常set操作即可
       }, 1000);
       return () => clearInterval(id);
   }, []);

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

相关文章

  • React中如何使用scss

    React中如何使用scss

    这篇文章主要介绍了React中如何使用scss问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • React 状态管理工具优劣势示例分析

    React 状态管理工具优劣势示例分析

    这篇文章主要为大家介绍了React 状态管理工具优劣势示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • react配置webpack-bundle-analyzer项目优化踩坑记录

    react配置webpack-bundle-analyzer项目优化踩坑记录

    这篇文章主要介绍了react配置webpack-bundle-analyzer项目优化踩坑记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 详解React中的todo-list

    详解React中的todo-list

    这篇文章主要介绍了React中的todo-list的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-07-07
  • TypeScript在React中的应用技术实例解析

    TypeScript在React中的应用技术实例解析

    这篇文章主要为大家介绍了TypeScript在React中的应用技术实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • react中axios结合后端实现GET和POST请求方式

    react中axios结合后端实现GET和POST请求方式

    这篇文章主要介绍了react中axios结合后端实现GET和POST请求方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 深入理解react-router@4.0 使用和源码解析

    深入理解react-router@4.0 使用和源码解析

    这篇文章主要介绍了深入理解react-router@4.0 使用和源码解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • React经典面试题之倒计时组件详解

    React经典面试题之倒计时组件详解

    这些天也都在面试,面试的内容也大多千篇一律,无外乎vue、react这些框架的一些原理,和使用方法,但是也遇到些有趣的题目,这篇文章主要给大家介绍了关于React经典面试题之倒计时组件的相关资料,需要的朋友可以参考下
    2022-03-03
  • React Native 图片查看组件的方法

    React Native 图片查看组件的方法

    这篇文章主要介绍了React Native 图片查看组件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • React传递参数的几种方式

    React传递参数的几种方式

    本文详细的介绍了React传递参数的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06

最新评论