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

React-admin表单问题:提交获取值及动态字段取值

问题解决:React-admin表单提交空对象及动态字段取值

问题根源

你混用了react-hook-form和React-admin自带的<Form>组件,两者的表单管理机制冲突——React-admin的<Form>内部已经集成了表单状态管理,手动引入的useForm无法正确注册React-admin的表单字段,导致提交时获取空对象。

解决方案

移除react-hook-form依赖,利用React-admin自身的表单能力实现需求,以下提供两种可行方案:


方案1:提交时手动过滤字段(简单直接)

直接通过React-admin<Form>的onSubmit回调获取完整表单值,再根据show状态过滤出需要的字段:

import { useState } from "react";
import { Button, Create, Form, TextInput } from "react-admin";

const CreateFormList = () => {
  const [show, setShow] = useState(false);
  const defaultValues = { author: "suresh", title: "you can" };

  const onSubmitHandler = (values) => {
    // 根据show状态过滤字段
    const filteredValues = show 
      ? { title: values.title, author: values.author } 
      : { title: values.title };
    console.log("filtered submit values", filteredValues);
    // 此处添加你的业务提交逻辑(如调用API)
  };

  return (
    <Create>
      <Form
        defaultValues={defaultValues}
        onSubmit={onSubmitHandler}
      >
        <TextInput source="title" />
        {show && <TextInput source="author" />}
        <Button onClick={() => setShow(!show)} label={show ? "隐藏作者字段" : "显示作者字段"} />
        <Button type="submit" label="submit" />
      </Form>
    </Create>
  );
};

export default CreateFormList;

方案2:动态注册/注销字段(精确控制表单状态)

通过React-admin的useFormContext钩子,在show状态变化时手动注册或注销字段,确保表单值仅包含当前显示的字段:

import { useState, useEffect } from "react";
import { Button, Create, Form, TextInput, useFormContext } from "react-admin";

const CreateFormList = () => {
  const [show, setShow] = useState(false);
  const defaultValues = { author: "suresh", title: "you can" };
  const { register, unregister } = useFormContext();

  // 监听show状态变化,动态注册/注销author字段
  useEffect(() => {
    if (show) {
      register("author");
    } else {
      unregister("author");
    }
  }, [show, register, unregister]);

  const onSubmitHandler = (values) => {
    console.log("submit values", values);
    // 此时values自动匹配当前显示的字段
  };

  return (
    <Create>
      <Form
        defaultValues={defaultValues}
        onSubmit={onSubmitHandler}
      >
        <TextInput source="title" />
        {show && <TextInput source="author" />}
        <Button onClick={() => setShow(!show)} label={show ? "隐藏作者字段" : "显示作者字段"} />
        <Button type="submit" label="submit" />
      </Form>
    </Create>
  );
};

export default CreateFormList;

说明

  • React-admin的<Form>组件无需额外引入第三方表单库,直接通过onSubmit即可获取表单值。
  • 方案1适合简单场景,通过提交时过滤快速实现需求;方案2适合需要严格控制表单字段状态的场景,确保表单值与页面显示完全同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:15:10