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

如何让useEffect在数据正确获取完成后再执行对应逻辑?

问题根源

  • React状态更新是异步行为,setXnaLogData执行后,当前作用域下的xnaLogData还是更新前的旧值(初始空数组),所以调用calBal时计算的是空数组的总和,自然得不到正确结果
  • 把xnaLogData加入useEffect依赖后,每次执行effect都会调用setXnaLogData触发状态更新,状态更新又触发effect重新执行,就形成了无限循环

解决方案

不要依赖当前闭包内的旧状态计算余额,直接用接口返回的最新数据计算,同时增加边界判断避免undefined报错。

修正后完整代码

const [xnaLogData,setXnaLogData]=useState([]);
const [xnaLogMember,setXnaLogMember]=useState("");
const [balance,setBalance]=useState(0);
 
useEffect(() => {
    // 直接存cookie值到变量,不需要等状态更新再使用
    const member = Cookies.get('member_userr');
    setXnaLogMember(member);
    alert(member);

    const fetchXna = async () => {
        try {
            const response = await fetch('/xnaloginforoute');
            const json = await response.json();
            const newXnaData = json.xnacomp || [];
            setXnaLogData(newXnaData);
            // 直接用接口返回的最新数据计算余额,不用等state更新
            const sum = newXnaData.reduce((prev, current) => {
                // 加空值判断避免current.balance不存在时报错
                return prev + (Number(current?.balance) || 0)
            }, 0);
            setBalance(sum);
            console.log(newXnaData);
        } catch (err) {
            console.error('数据获取失败', err);
        }
    }

    fetchXna();
},[]);

核心修改点

  • 移除了calBal方法,直接用接口返回的原始数据计算余额,避开状态异步更新的问题
  • 增加了空值兼容判断,就算接口返回数据结构异常也不会抛出undefined报错
  • 把cookie取值直接存到变量使用,避免刚set完状态就拿旧值的问题
  • 增加了请求异常捕获逻辑,避免接口报错导致页面崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:21:04