React Admin:如何从触发页传递realm_id至Client创建组件并显示指定Realm
解决方案:传递realm_id到ClientCreate组件并限制Realm选项
要实现从触发创建的页面传递realm_id到ClientCreate组件,仅显示对应单个Realm,可按以下步骤修改代码:
1. 修改CreateButton,传递realm_id参数
假设你的CreateButton位于Realm相关页面(如RealmShow或RealmList),通过to属性将当前页面的realm_id作为查询参数附加到创建路径中:
<TopToolbar> <CreateButton basePath="/clients" to={{ pathname: '/clients/create', // record.id为当前页面的Realm ID,根据实际场景调整取值逻辑 search: `?realm_id=${record.id}` }} /> </TopToolbar>
2. 修改ClientCreate组件,接收并处理realm_id
通过react-router-dom的useLocation钩子获取URL中的realm_id参数,可选择以下两种方式处理Realm输入:
方式一:隐藏Realm输入字段(推荐)
直接将realm_id作为隐藏字段传入表单,不显示下拉选择框:
import { useLocation } from 'react-router-dom'; import { Create, SimpleForm, TextInput, HiddenInput } from 'react-admin'; export const ClientCreate = (props) => { const location = useLocation(); const realmId = new URLSearchParams(location.search).get('realm_id'); return ( <Create {...props}> <SimpleForm initialValues={{ realm_id: realmId }}> <HiddenInput source="realm_id" /> <TextInput fullWidth source="client_name" label="Client name" /> </SimpleForm> </Create> ); };
方式二:保留下拉框但仅显示对应Realm
如果需要展示Realm信息但不允许修改,可过滤下拉选项并禁用输入:
import { useLocation } from 'react-router-dom'; import { Create, SimpleForm, TextInput, ReferenceInput, SelectInput } from 'react-admin'; export const ClientCreate = (props) => { const location = useLocation(); const realmId = new URLSearchParams(location.search).get('realm_id'); return ( <Create {...props}> <SimpleForm initialValues={{ realm_id: realmId }}> <ReferenceInput label="Realm" source="realm_id" reference="realms" filter={{ id: realmId }} disabled > <SelectInput optionText="id" /> </ReferenceInput> <TextInput fullWidth source="client_name" label="Client name" /> </SimpleForm> </Create> ); };
3. 确认App配置无需修改
原有的App资源配置保持不变即可,参数传递逻辑已通过路由查询参数实现:
const App = () => ( <Admin dataProvider={dataProvider} layout={AppLayout}> <Resource name="realms" list={RealmsList} show={RealmShow} edit={RealmEdit} create={RealmCreate}/> <Resource name="clients" edit={ClientEdit} create={ClientCreate}/> </Admin> );
内容的提问来源于stack exchange,提问作者Shridutt Kothari
相关产品推荐
相关产品推荐

