React state在setInterval里未获取最新值的问题

目录

一、问题描述

二、解决方案

方案一,使用函数式更新

[方案二,使用 useRef 保存最新值](#方案二,使用 useRef 保存最新值)


一、问题描述

在 React 中,当在 setInterval或setTimeout 中使用 setState 时,经常会遇到状态不是最新值的问题。这是因为闭包导致的,setInterval 回调函数捕获的是初始状态值。

二、解决方案

方案一,使用函数式更新
javascript 复制代码
useEffect(() => {
  const interval = setInterval(() => {
    // 使用函数式更新,获取最新的状态
    setCount(prevCount => prevCount + 1);
  }, 1000);
  
  return () => clearInterval(interval);
}, []);
方案二,使用 useRef 保存最新值
javascript 复制代码
import { useState, useEffect, useRef } from 'react';

function Counter() {
  const [count, setCount] = useState(0);
  const countRef = useRef(count);

  // 保持 ref 与状态同步
  useEffect(() => {
    countRef.current = count;
  }, [count]);

  useEffect(() => {
    const interval = setInterval(() => {
      // 通过 ref 获取最新值
      setCount(countRef.current + 1);
    }, 1000);
    
    return () => clearInterval(interval);
  }, []);

  return <div>计数: {count}</div>;
}

以上解决方案可解此问题。

相关推荐
css趣多多18 小时前
this.$watch
前端·javascript·vue.js
Code小翊19 小时前
JS语法速查手册,一遍过JS
javascript
●VON19 小时前
React Native for OpenHarmony:ScrollView 事件流、布局行为与性能优化深度剖析
学习·react native·react.js·性能优化·openharmony
干前端19 小时前
Vue3虚拟滚动列表组件进阶:不定高度及原理分析!!!
前端·前端组件
子春一19 小时前
Flutter for OpenHarmony:构建一个 Flutter 天气卡片组件,深入解析动态 UI、响应式布局与语义化设计
javascript·flutter·ui
雨季66619 小时前
Flutter 三端应用实战:OpenHarmony “极简文本行数统计器”
开发语言·前端·flutter·ui·交互
2601_9495936519 小时前
高级进阶 React Native 鸿蒙跨平台开发:LinearGradient 玻璃拟态卡片
react native·react.js·harmonyos
MAHATMA玛哈特科技19 小时前
以曲求直:校平技术中的反直觉哲学
前端·数据库·制造·校平机·矫平机·液压矫平机
C澒19 小时前
前端技术核心领域与实践方向
前端·系统架构
摘星编程19 小时前
在OpenHarmony上用React Native:TopTab顶部标签页
react native·react.js·harmonyos