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

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

相关推荐
LiuJun2Son4 分钟前
Angular 快速入门:从零搭建你的第一个应用
前端·javascript·angular.js
烬羽4 分钟前
从零理解树与二叉树:用 JS 带你手撕遍历和递归
javascript·数据结构
小徐_233312 分钟前
Wot UI 2.1.0 发布:ConfigProvider 全局配置能力升级
前端·uni-app
方白羽13 分钟前
Vibe Coding 四个核心阶段
android·前端·app
奶油话梅糖13 分钟前
浏览器解析 HTML 头部的底层逻辑:从字节流到资源调度
前端·html
YHL14 分钟前
🚀从零理解树与二叉树 —— 概念、实现与遍历
前端·javascript·数据结构
小时前端15 分钟前
微前端技术选型深度分析:从概念到实践
前端
十九画生16 分钟前
学 JavaScript 数据类型,真正要搞懂的是:变量里存的到底是什么?
javascript
ZengLiangYi18 分钟前
测试策略:单元测试 + 集成测试怎么写
javascript·typescript·node.js
wyhwust29 分钟前
基于Apifox的接口管理工具
前端