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

如何在Edit组件内不使用<SimpleForm>即可访问record记录数据

问题原因

你在GenericEdit根作用域调用useRecordContext()的时机不对:
RecordContext是由<Edit>组件在内部拉取完数据后才提供的,且<SimpleForm>也会继承/透传这个上下文。你当前调用Hook的位置在<Edit>组件外部,自然拿不到记录数据;同时<Edit>组件默认负责数据拉取逻辑,所以上层的GenericEdit props 里只会携带路由解析出的id、资源名等元信息,不会包含完整记录。


解决方案

提供两种常用实现方式,可按需选择:

方案1:在GenericEdit内主动拉取记录数据

直接用react-admin内置的useGetOne钩子,配合props里的id、resource上下文即可自行拉取完整记录:

import { useGetOne, useResourceContext, Edit, SimpleForm, TextInput } from 'react-admin';

const GenericEdit = function (props) {
    const resource = useResourceContext();
    // 主动拉取当前id对应的记录
    const { data: record, isLoading, error } = useGetOne(resource, { id: props.id });
    
    // 可在这里直接使用record数据做自定义逻辑
    console.log('自行拉取的完整record', record);

    if (isLoading) return <div>加载中</div>;
    if (error) return <div>加载失败</div>;

    return (
        <Edit {...props}>
            <SimpleForm>
                <TextInput disabled label="Id" source="id" />
                <TextInput label="Name" source="name" />
            </SimpleForm>
        </Edit>
    )
};
export default GenericEdit;

方案2:利用<Edit>的内置上下文/渲染属性

<Edit>组件本身已经内置了数据拉取逻辑,你可以通过两种方式拿到它拉好的record:

方式A:用render props直接接收record
const GenericEdit = function (props) {
    return (
        <Edit {...props}>
            {/* Edit的children如果是函数,会自动传入拉取好的record */}
            {({ record }) => {
                // 这里可以直接使用record做自定义逻辑
                console.log('从Edit render props拿到的record', record);
                return (
                    <SimpleForm>
                        <TextInput disabled label="Id" source="id" />
                        <TextInput label="Name" source="name" />
                    </SimpleForm>
                )
            }}
        </Edit>
    )
};
方式B:把自定义逻辑封装为<Edit>的子组件,在子组件内调用useRecordContext

只要是<Edit>包裹的子组件,都可以正常拿到RecordContext的值:

// 抽离自定义逻辑组件
const CustomEditContent = () => {
    const record = useRecordContext();
    // 这里可以正常拿到record
    console.log('子组件内拿到的record', record);
    return (
        <SimpleForm>
            <TextInput disabled label="Id" source="id" />
            <TextInput label="Name" source="name" />
        </SimpleForm>
    )
}

const GenericEdit = function (props) {
    return (
        <Edit {...props}>
            <CustomEditContent />
        </Edit>
    )
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:15:02