form.item接管受控组件

先回顾一下 React 的受控组件

  • 普通受控组件(例如 SwitchInput):
    你需要自己传 value/checkedonChange,手动管理 state。
ini 复制代码
const [checked, setChecked] = useState(false);

<Switch checked={checked} onChange={setChecked} />;

这里 Switch 的状态完全由外层 state 控制。

📦 Antd Form.Item 的做法

Form.Item 让你不必自己写 state + onChange,它会:

  1. 读取表单的值(Form store 里的值)。
  2. 把值传递给子组件 (通过 valuePropNamegetValueProps)。
  3. 拦截子组件的事件 (通过 trigger,默认是 onChange),自动更新 Form store。

✅自己封装的受控组件一样可以被 Form.Item 接管,只要满足 受控组件的契约

🔑 什么样的组件能被 Form.Item 接管?

一个组件想要被 Form.Item 接管,至少要符合这几点:

  1. 有一个"值"属性

    比如 valuechecked,由外部传入。

  2. 有一个"触发变更"的事件

    比如 onChange,当用户交互时调用,并把新值传出去。

  3. Form.Item 上声明:

    • valuePropName → 指定用哪个属性当值(value / checked)。
    • trigger → 指定用哪个事件更新值(默认是 onChange)。

这样 Form.Item 就能拦截你的组件,帮你和表单 store 打通。


🌰 举个例子

比如你自己封装了一个组件:

typescript 复制代码
interface MySwitchProps {
  value?: boolean;  // 外部控制的值
  onChange?: (value: boolean) => void;  // 值变化时的回调
}

const MySwitch: React.FC<MySwitchProps> = ({ value = false, onChange }) => {
  return (
    <button
      style={{
        background: value ? "green" : "red",
        color: "white",
        padding: "4px 8px"
      }}
      onClick={() => onChange?.(!value)}
    >
      {value ? "开" : "关"}
    </button>
  );
};

这是一个完全受控的组件。

放到表单里,就能自动接管:

ini 复制代码
<Form.Item
  label="自定义开关"
  name="mySwitch"
  valuePropName="value"   // 指定组件的受控属性
>
  <MySwitch />
</Form.Item>

🧩 再复杂点:属性名不是 value

假设你写的组件属性是 checked 而不是 value

typescript 复制代码
interface MyToggleProps {
  checked?: boolean;
  onChange?: (checked: boolean) => void;
}

那么 Form.Item 要这样写:

ini 复制代码
<Form.Item
  label="自定义 Toggle"
  name="myToggle"
  valuePropName="checked"   // 告诉表单用 checked 作为值
>
  <MyToggle />
</Form.Item>

✅ 结论:你自己封装的任何受控组件,都可以被 Form.Item 托管,只要有「值属性 + 触发事件」,并正确配置 valuePropName / trigger

ini 复制代码
<Form.Item
  name="myToggle"
  valuePropName="checked"       // 指定值的属性名
  trigger="onCheckedChange"     // 指定触发更新的事件名
>
  <MyToggle />
</Form.Item>
相关推荐
却尘7 分钟前
Next.js 请求最佳实践 - vercel 2026一月发布指南
前端·react.js·next.js
ccnocare8 分钟前
浅浅看一下设计模式
前端
Lee川12 分钟前
🎬 从标签到屏幕:揭秘现代网页构建与适配之道
前端·面试
Ticnix39 分钟前
ECharts初始化、销毁、resize 适配组件封装(含完整封装代码)
前端·echarts
纯爱掌门人42 分钟前
终焉轮回里,藏着 AI 与人类的答案
前端·人工智能·aigc
twl1 小时前
OpenClaw 深度技术解析
前端
崔庆才丨静觅1 小时前
比官方便宜一半以上!Grok API 申请及使用
前端
星光不问赶路人1 小时前
vue3使用jsx语法详解
前端·vue.js
天蓝色的鱼鱼1 小时前
shadcn/ui,给你一个真正可控的UI组件库
前端
布列瑟农的星空1 小时前
前端都能看懂的Rust入门教程(三)——控制流语句
前端·后端·rust