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

React中SWR获取的数据无法作为props传递给子组件StyleCard问题求助

问题根因

  1. SWR 首次渲染时data为undefined,此时传递给StyleCard的assets、styleNumber均为undefined,和你子组件定义的必填类型不匹配,会导致类型异常。
  2. useMemo没有设置兜底值,当data?.assets不存在时,currentAssets返回值为undefined而非空数组,不符合子组件IAsset[]的类型要求。
  3. 父组件未做加载态判断,数据未返回时就渲染子组件,后续SWR拉取数据完成触发重渲染时,若子组件有React.memo等优化逻辑可能会跳过更新。

修复方案

  1. 给useMemo添加兜底返回值,保证currentAssets始终为数组类型:
const currentAssets = useMemo(() => {
  const result: IAsset[] = data?.assets?.map(x => {
    return {
          perspective_number: x.perspective.number,
          storage_url: x.file.storageUrl
        } as IAsset
  }) || []
  return result;
}, [data?.assets]);
  1. 父组件添加加载判断,等数据返回后再渲染子组件,避免传递undefined值:
return (
  <Stack spacing={6}>
     <Stack ml="100px" minWidth="480px" maxWidth="480px">
      {/* 仅当data存在时渲染StyleCard */}
      {data && (
        <StyleCard
           assets={currentAssets}
           styleNumber={data.styleNumber}
        />
      )}
      <Text>{data?.name}</Text>
     </Stack>
   </Stack>
);
  1. 可选优化:调整子组件接口兼容可选值,或添加props默认值:
export interface IStyleCard{
   assets?: IAsset[],
   styleNumber?: number
}

export function StyleCard({
  assets = [],
  styleNumber = 0
}: IStyleCard): JSX.Element {
  return (
    <Stack>
      <Text> Props Assets {JSON.stringify(assets)}</Text>
      <Text> Props styleNumber {styleNumber}</Text>
    </Stack>
  );
}
  1. 若你使用了React.memo包裹StyleCard,先移除memo验证是否是更新逻辑被拦截,若确认是memo导致,调整memo的比较逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:09:03