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>
相关推荐
我是伪码农8 分钟前
Vue 2.3
前端·javascript·vue.js
夜郎king32 分钟前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
夏幻灵2 小时前
HTML5里最常用的十大标签
前端·html·html5
Mr Xu_2 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝2 小时前
RBAC前端架构-01:项目初始化
前端·架构
程序员agions2 小时前
2026年,微前端终于“死“了
前端·状态模式
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
程序员猫哥_2 小时前
HTML 生成网页工具推荐:从手写代码到 AI 自动生成网页的进化路径
前端·人工智能·html
龙飞052 小时前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl
我爱加班、、2 小时前
Websocket能携带token过去后端吗
前端·后端·websocket