React中SWR获取的数据无法作为props传递给子组件StyleCard问题求助
问题根因
- SWR 首次渲染时
data为undefined,此时传递给StyleCard的assets、styleNumber均为undefined,和你子组件定义的必填类型不匹配,会导致类型异常。 useMemo没有设置兜底值,当data?.assets不存在时,currentAssets返回值为undefined而非空数组,不符合子组件IAsset[]的类型要求。- 父组件未做加载态判断,数据未返回时就渲染子组件,后续SWR拉取数据完成触发重渲染时,若子组件有
React.memo等优化逻辑可能会跳过更新。
修复方案
- 给
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]);
- 父组件添加加载判断,等数据返回后再渲染子组件,避免传递
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> );
- 可选优化:调整子组件接口兼容可选值,或添加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> ); }
- 若你使用了
React.memo包裹StyleCard,先移除memo验证是否是更新逻辑被拦截,若确认是memo导致,调整memo的比较逻辑即可。
内容的提问来源于stack exchange,提问作者DLO
相关产品推荐
相关产品推荐

