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

Admin on Rest教程:如何结合ReferenceInput使用DependentInput

解决React Admin中ReferenceInput与DependentInput的字段联动问题

首先得指出你当前代码里的核心问题:DependentInput的dependsOn="type.value"是无法生效的,因为你的ReferenceInput绑定的source="type"对应的是level_type表的id值(也就是level表中type字段存储的是关联ID),而不是level_type的value字段,表单的状态里并没有type.value这个路径,所以联动逻辑触发不了。

下面给你两种可行的解决方案,你可以根据自己的需求选择:

方案一:通过数据获取钩子直接判断关联资源的字段

这种方式不需要依赖DependentInput,而是利用React Admin的useGetOne钩子获取选中的level_type详情,结合表单状态来控制字段显示:

import { Edit, SimpleForm, ReferenceInput, SelectInput, NumberInput, useGetOne, useFormState } from 'react-admin';

export const LevelEdit = (props) => {
    // 获取当前表单的状态值
    const { values } = useFormState();
    // 根据选中的type ID,获取对应的level_type记录(只有当type存在时才发起请求)
    const { data: levelType } = useGetOne('level_type', { id: values.type, enabled: !!values.type });

    return (
        <Edit {...props}>
            <SimpleForm>
                <ReferenceInput source="type" reference="level_type">
                    <SelectInput optionText="value" />
                </ReferenceInput>
                {/* 当选中的level_type的value为"test2"时,渲染NumberInput */}
                {levelType?.value === 'test2' && (
                    <NumberInput source="field" />
                )}
            </SimpleForm>
        </Edit>
    );
};

这个方案的优势是逻辑直观,不需要额外处理表单的临时字段,直接通过关联资源的真实数据来控制显示。

方案二:通过临时字段配合DependentInput实现联动

如果你希望保留DependentInput的使用方式,可以通过自定义ReferenceInput的onChange事件,把选中的level_type的value存入一个临时表单字段,让DependentInput依赖这个字段:

import { Edit, SimpleForm, ReferenceInput, SelectInput, DependentInput, NumberInput, useForm } from 'react-admin';

export const LevelEdit = (props) => {
    const { mutate } = useForm();

    const handleTypeChange = (selectedId, selectedOption) => {
        // 更新表单中type字段的值(关联ID)
        mutate({ type: selectedId });
        // 将选中的level_type的value存入临时字段typeValue
        mutate({ typeValue: selectedOption.value });
    };

    return (
        <Edit {...props}>
            <SimpleForm>
                <ReferenceInput 
                    source="type" 
                    reference="level_type"
                    onChange={handleTypeChange}
                >
                    <SelectInput optionText="value" />
                </ReferenceInput>
                {/* 依赖临时字段typeValue,当值为"test2"时显示NumberInput */}
                <DependentInput dependsOn="typeValue" value="test2">
                    <NumberInput source="field" />
                </DependentInput>
            </SimpleForm>
        </Edit>
    );
};

这里的typeValue是一个临时字段,不会被提交到后端,只是用来做联动判断,完美适配DependentInput的使用逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:48:55