为什么 Form 组件中的表单控件不用 value 和 onChange 也能受控?

大家好,我是麦当。

我们写 React 的时候,一般想要让 input 元素受控,都需要为其添加 valueonChange 这两个属性,如下:

html 复制代码
  <input value={val} onChange={(e) => setVal(e.target.value)} />

但是用过 Antd 4、5 的人一定知道,Form 表单中的 FormItem,只要添加了 name 属性,便可以自动控制表单控件。本文就来聊聊 Form 组件是如何实现使表单元素自动受控的。

jsx 复制代码
<Form  
    initialValues={{ book: '玩转 React Hooks' }}  
    onFinish={(data: any) => {  
        console.log(data)  
    }}   
>  
    <Form.Item label="title" name="title">  
        <Input placeholder="please enter title"/>  
    </Form.Item>  
    <Form.Item>  
        <Button type="primary" htmlType="submit">  
            Submit
        </Button>  
    </Form.Item>  
</Form>  
  

原理

FormItem 里用到了 React.cloneElement 这个 api, FormItem 在渲染 children 前,会对 children 进行一次克隆,然后新增了 value 和 onChange 这两个 props 作为 children 的参数,这样就实现了表单控件的受控。然后在其他地方对数据进行统一管理。

代码

源码部分可以在这里查看,核心是 cloneElement 那一部分。

相关推荐
Kakarotto13 分钟前
Canvas 直线点击事件处理优化
javascript·vue.js·canvas
顺遂13 分钟前
基于Rokid CXR-M SDK的引导式作业辅导系统设计与实现
前端
代码搬运媛13 分钟前
Generator 迭代器协议 & co 库底层原理+实战
前端
前端拿破轮15 分钟前
从0到1搭建个人网站(三):用 Cloudflare R2 + PicGo 搭建高速图床
前端·后端·面试
功能啥都不会19 分钟前
PM2 使用指南 - 踩坑记录
前端
HelloReader20 分钟前
React 中 useState、useEffect、useRef 的区别与使用场景详解,终于有人讲明白了
前端
兆子龙21 分钟前
CSS 里的「if」:@media、@supports 与即将到来的 @when/@else
前端
踩着两条虫21 分钟前
AI 智能体如何重构开发工作流
前端·人工智能·低代码
代码老中医43 分钟前
逃离"Div汤":2026年,当AI写了75%的代码,前端开发者还剩什么?
前端
进击的尘埃43 分钟前
Playwright Component Testing 拆到底:组件怎么挂上去的,快照怎么在 CI 里不翻车
javascript