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

Expo应用刷新后组件与数据消失,热更新后恢复问题求助

Expo应用页面刷新后组件数据消失问题解决

问题描述

  • Expo应用页面刷新后组件及数据消失,修改任意代码(如添加分号)保存后数据重新显示,再次刷新又消失
  • 核心逻辑是合并getSign与getLine的数据生成Final,刷新后Final返回空数组,代码修改后能返回正确数据
  • 尝试过同类问题的Stack Overflow解法,无效

问题原因

原代码的核心问题是异步操作顺序错误:
getSign和getLine是异步获取数据并更新state的操作,但你在调用它们后立刻执行getFinal合并数据。此时Sign和Linedata还处于初始空数组状态,合并结果自然为空。而代码修改后的热重载会保留之前的state缓存,所以能正确合并数据。

解决方案

方案一:等待异步请求完成后再合并

修改getSign和getLine使其返回Promise,确保数据请求完成后再执行合并:

const [Final, setFinal] = useState([]);
const [Sign, setSign] = useState([]);
const [Linedata, SetLinedata] = useState([]);      

// 让getSign返回Promise,完成数据请求并更新state后返回数据
const getSign = async () => {
  const signData = await yourSignDataFetch(); // 替换为你的实际数据请求逻辑
  setSign(signData);
  return signData;
};

// 同理修改getLine
const getLine = async () => {
  const lineData = await yourLineDataFetch(); // 替换为你的实际数据请求逻辑
  SetLinedata(lineData);
  return lineData;
};

useEffect(() => {
  (async () => {
    // 等待两个请求都完成
    await Promise.all([getSign(), getLine()]);
    // 此时Sign和Linedata已更新,执行合并
    const mergedData = Sign.map(item => ({
      ...item,
      Line: Linedata[item['sign']]
    }));
    setFinal(mergedData);
  })();
}, []);

方案二:监听state变化自动合并

通过监听Sign和Linedata的状态,当两者都有数据时自动执行合并:

const [Final, setFinal] = useState([]);
const [Sign, setSign] = useState([]);
const [Linedata, SetLinedata] = useState([]);      

// 初始加载时触发数据请求
useEffect(() => {
  getSign();
  getLine();
}, []);

// 监听Sign和Linedata的变化,仅当两者非空时合并
useEffect(() => {
  if (Sign.length && Linedata.length) {
    const mergedData = Sign.map(item => ({
      ...item,
      Line: Linedata[item['sign']]
    }));
    setFinal(mergedData);
  }
}, [Sign, Linedata]);

// 你的异步数据请求函数示例
const getSign = async () => {
  const res = await fetch('你的签名数据接口');
  const data = await res.json();
  setSign(data);
};

const getLine = async () => {
  const res = await fetch('你的线路数据接口');
  const data = await res.json();
  SetLinedata(data);
};

关键说明

  • React的state更新是异步的,不能在调用state更新函数后立刻依赖新的state值
  • 页面刷新时所有state会重置为初始值,而热重载会保留当前state,这就是两种场景结果不同的原因

内容的提问来源于stack exchange,提问作者Eric.P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:35:06