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

简介: 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)
}
目录
相关文章
|
测试技术 开发工具 git
React 16 Jest定时器模拟 Timer Mocks
转载 React 16 Jest定时器模拟 Timer Mocks 项目初始化 git clone https://github.
1454 0
|
Web App开发 前端开发
|
6月前
|
设计模式 前端开发 数据可视化
【第4期】一文了解React UI 组件库
【第4期】一文了解React UI 组件库
355 0
|
6月前
|
存储 前端开发 JavaScript
【第34期】一文学会React组件传值
【第34期】一文学会React组件传值
74 0
|
6月前
|
前端开发
【第31期】一文学会用React Hooks组件编写组件
【第31期】一文学会用React Hooks组件编写组件
76 0
|
6月前
|
存储 前端开发 JavaScript
【第29期】一文学会用React类组件编写组件
【第29期】一文学会用React类组件编写组件
74 0
|
6月前
|
前端开发 开发者
【第26期】一文读懂React组件编写方式
【第26期】一文读懂React组件编写方式
62 0
|
6月前
|
资源调度 前端开发 JavaScript
React 的antd-mobile 组件库,嵌套路由
React 的antd-mobile 组件库,嵌套路由
120 0
|
6月前
|
存储 前端开发 中间件
React组件间的通信
React组件间的通信
52 1
|
6月前
|
前端开发 JavaScript API
React组件生命周期
React组件生命周期
118 1