You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React组件中如何在第二个useEffect中获取更新后的state?

问题分析与解决

问题根源

你的第二个useEffect依赖数组里只有depdency2,这意味着它只会在组件首次挂载、以及depdency2的值发生变化时执行。当第一个useEffect触发setEditData更新editData后,depdency2没有变化,所以第二个useEffect不会重新执行。再加上React闭包的特性,这个useEffect会捕获组件初始渲染时的editData值,自然打印的是初始的initData。

解决方案

方案1:将editData加入第二个useEffect的依赖数组

如果需求是只要editData更新或者depdency2变化,就执行第二个useEffect的逻辑,直接把editData添加到依赖数组里即可:

import React, { useEffect, useState } from "react";
import "./styles.css";

export default function MyComponent() {
  const [editData, setEditData] = useState("initData");

  const depdency1 = "depdency1";
  const depdency2 = "depdency2";

  useEffect(() => {
    mufuction();
  }, [depdency1]);

  const mufuction = () => {
    setEditData("Updated Data");
  };

  // 把editData加入依赖数组
  useEffect(() => {
    console.log("editData", editData);
  }, [depdency2, editData]);

  return <div className="App"></div>;
}

这样每当editData或depdency2变化时,这个useEffect都会重新执行,打印出最新的editData值。

方案2:用useRef保存state的最新引用

如果需求是只在depdency2变化时执行第二个useEffect,但要在里面获取最新的editData值,可以借助useRef来存储state的实时引用:

import React, { useEffect, useState, useRef } from "react";
import "./styles.css";

export default function MyComponent() {
  const [editData, setEditData] = useState("initData");
  // 定义ref保存editData的最新值
  const editDataRef = useRef(editData);

  const depdency1 = "depdency1";
  const depdency2 = "depdency2";

  // 每次editData更新时,同步更新ref的current值
  useEffect(() => {
    editDataRef.current = editData;
  }, [editData]);

  useEffect(() => {
    mufuction();
  }, [depdency1]);

  const mufuction = () => {
    setEditData("Updated Data");
  };

  useEffect(() => {
    // 通过ref.current获取最新的editData
    console.log("editData", editDataRef.current);
  }, [depdency2]);

  return <div className="App"></div>;
}

useRef的current属性是可变的,不会受React渲染周期闭包的影响,所以能始终拿到最新的editData值。

内容的提问来源于stack exchange,提问作者Rohit Verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:50:55