新版React-Admin中useRecordContext可空时数据提供者钩子如何处理?
React-Admin中useRecordContext可空后的关联数据获取方案
针对useRecordContext变为可空类型后,无法直接条件调用useGetOne的问题,有两种实用解决方案:
方案一:父组件控制渲染,通过props传递非空record
将组件拆分为父组件和子组件,在父组件中判断record是否存在,仅当record有效时才渲染子组件,并将record作为props传入。这样子组件内可确保record非空,安全调用useGetOne。
// 父组件 const ParentComponent = () => { const record = useRecordContext<User>(); if (!record) return null; return <ExampleComponent record={record} />; }; // 子组件(原ExampleComponent) export const ExampleComponent = ({ record }: { record: User }) => { const { data } = useGetOne<Car>(`user/${record.userId}/cars/${record.carId}`, {}); return <> {data?.name} </>; };
方案二:利用useGetOne的enabled选项延迟请求
无需拆分组件,直接在当前组件中调用useGetOne,但通过enabled配置项控制请求时机——仅当record存在时才发起请求。这种方式符合React Hook的调用规则(每次渲染都调用Hook,只是条件性启用请求)。
export const ExampleComponent = () => { const record = useRecordContext<User>(); const { data } = useGetOne<Car>( record ? `user/${record.userId}/cars/${record.carId}` : '', {}, { enabled: !!record } // 仅record存在时启用请求 ); if (!record) return <>无可用数据</>; return <> {data?.name} </>; };
注意:两种方案都需要处理data可能为空的情况(比如请求未完成或失败),建议使用可选链data?.name避免报错。
内容的提问来源于stack exchange,提问作者Heikkisorsa
相关产品推荐
相关产品推荐

