为什么 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 那一部分。

相关推荐
Ferries4 分钟前
《从前端到 Agent》系列|03:应用层-RAG(检索增强生成,Retrieval-Augmented Generation)
前端·人工智能·机器学习
Jessica_Lee8 分钟前
Openclaw智能体终止机制
javascript
米丘10 分钟前
Connect 深度解析:Node.js 中间件框架的基石
javascript·http·node.js
饺子不吃醋11 分钟前
执行上下文:变量提升、作用域与 this 底层机制
javascript
菲利普马洛13 分钟前
记一次主题闪烁问题
前端·css·react.js
谁在黄金彼岸14 分钟前
nvm for windows之死:别再被这个“过时工具”耽误开发
前端
汉堡大王952715 分钟前
为了搞懂 Promise 源码,我重写了 MiniPromise
前端·javascript
臧玉波16 分钟前
一文读懂 JS 原型链
javascript
llq_35016 分钟前
使用 devServer Proxy 本地开发 POST 请求跨域报错问题及解决方案
前端
孙凯亮18 分钟前
前端DICOM Viewer开发避坑指南:从入门到实战(含切片、3D、标注全解析)
前端