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

React Native(TypeScript):父组件API未完成时子组件渲染致数据未定义问题

解决方案

1. 修正函数调用笔误

你的useEffect里定义的函数是UpdateDetails,但调用的是UpdateStockDetails,这会直接导致API逻辑未执行,isLoading保持初始值(大概率为false),组件直接渲染子组件并拿到undefined数据。把调用语句改成UpdateDetails()。

2. 初始化isLoading为true

确保组件启动时处于加载状态,避免初始渲染就渲染子组件:

const [isLoading, setIsLoading] = useState<boolean>(true);

3. 并行调用API提升性能

四个API调用相互独立,用Promise.all并行执行比串行await更高效:

useEffect(() => {
  async function UpdateDetails() {
    try {
      // 并行获取所有API数据
      const [intradayJSON, dailyJSON, weeklyJSON, monthlyJSON] = await Promise.all([
        getIntradayData(newSymbol),
        getDailyData(newSymbol),
        getWeeklyData(newSymbol),
        getMonthlyData(newSymbol)
      ]);

      // 解析并设置状态
      setIntraday(parseIntradayData(intradayJSON));          
      setDaily(parseDailyData(dailyJSON));
      setWeekly(parseWeeklyData(weeklyJSON));
      setMonthly(parseMonthlyData(monthlyJSON));
    } catch (error) {
      // 处理API调用错误,比如打印日志或提示用户
      console.error("API调用失败:", error);
    } finally {
      // 无论成功失败都结束加载状态
      setIsLoading(false);
    }
  }
  UpdateDetails();
}, [newSymbol]); // 依赖newSymbol,当它变化时重新触发API调用

4. 增强数据校验,避免强制断言

不要用!强制断言数据存在,在渲染子组件前额外检查数据有效性,防止API返回错误数据的情况:

if(isLoading){
  return <ActivityIndicator size='large' />
}

// 检查所有数据是否存在,不存在则显示错误占位
if (!intraday || !daily || !weekly || !monthly) {
  return <Text>数据加载失败,请重试</Text>;
}

// 数据全部有效时再渲染子组件
return (
  <ScrollView style={{ backgroundColor: black}}>
    <View style={{ flex: 1, justifyContent: 'space-between', padding: 10 }}>
      <View>
        <Graph 
          symbol={newSymbol} 
          intraday={intraday}
          daily={daily}
          weekly={weekly}
          monthly={monthly}
        />
      </View>
      ...
    </View>
  </ScrollView>
);

5. 子组件添加容错处理(可选)

在Graph组件中给props设置可选类型或默认值,即使父组件意外传递undefined,也能避免崩溃:

interface GraphProps {
  symbol: string;
  intraday?: IntradayInterface;
  daily?: DailyInterface;
  weekly?: WeeklyInterface;
  monthly?: MonthlyInterface;
}

const Graph = ({ symbol, intraday = {}, daily = {}, weekly = {}, monthly = {} }: GraphProps) => {
  // 组件逻辑,使用默认空对象避免undefined报错
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 00:42:40