React-Admin如何获取当前记录字段值作为ReferenceInput过滤条件
获取当前记录字段作为ReferenceInput过滤参数的实现方法
核心用React-Admin官方提供的useRecordContext钩子即可,这个方法兼容3.x后期版本、4.x、5.x全版本,不受组件嵌套层级影响,比直接从props取值稳定。
具体实现步骤:
- 把需要用到当前记录值的
ReferenceInput封装成独立组件 - 在组件内调用
useRecordContext()获取当前上下文里的整条记录 - 从返回的记录对象上直接取
client_id字段,传给filter配置即可 - 加个空值兜底,避免记录未加载完成时取值报错
完整代码示例:
import { Edit, SimpleForm, ReferenceInput, AutocompleteInput, useRecordContext } from 'react-admin'; import { useParams } from 'react-router-dom'; // 封装带过滤逻辑的关联选择输入组件 const FilteredTemplateInput = () => { const currentRecord = useRecordContext(); // 记录异步加载未完成时返回空,避免报错 if (!currentRecord) return null; return ( <ReferenceInput source="text_resume_template_id" reference="text_templates" filter={{ client_id: currentRecord.client_id }} > <AutocompleteInput optionText="name" /> </ReferenceInput> ); }; export const ReportsEdit = () => { const { id } = useParams(); return ( <Edit id={id}> <SimpleForm> {/* 其他字段输入组件放这里 */} <FilteredTemplateInput /> </SimpleForm> </Edit> ); };
关于你记忆里3.x版本直接从props取client_id的写法,只有直接作为Edit/Show第一层级子组件的时候才能拿到对应props,一旦组件嵌套层级变深(比如放在Form布局块里、拆分到独立子组件),props不会自动透传,就会拿不到值,用useRecordContext不存在这个问题。
额外注意:
如果是在Create页面用这个逻辑,用户还没选择/填写
client_id时字段值为空,建议加判断等client_id有值后再渲染选择器,避免发出无效的过滤请求:const FilteredTemplateInput = () => { const currentRecord = useRecordContext(); if (!currentRecord?.client_id) { return <div>请先选择关联客户后再选择模板</div>; } // 剩余ReferenceInput逻辑和上面一致 };
内容的提问来源于stack exchange,提问作者Diego Gaona
相关产品推荐
相关产品推荐

