antd对于form中输入控件的抽象十分简单,只要能接收value和onChange属性的组件都可以成为Form.Item的子组件,为Form对应的字段提供值。对于输入控件的抽象我认为这已经达到了极致,事件(onChange)产生值(value)。事件向上,值向下,完全符合React哲学。

如何实现一个标准的输入组件?

对于输入组件首先需要具备接收value和onChange属性的能力,这两个属性被提供的情况下这个组件被称为受控组件,它受到父组件控制,状态来自父组件。当父组件没有提供value的情况下该组件是非受控组件,有自己的状态。

是否受控主要取决于value属性是否提供,因为value决定了组件当前的状态,当前状态被父组件控制,所以称之为受控组件。

输入组件的状态是会改变的,最常见的方式就是来自用户行为,例如在input中输入内容,该组件的状态(value)就会改变。

  1. 因为组件可以作为非受控组件,所以组件自身有innerValue和setInnerValue用于展示和响应用户输入。
  2. 如果父组件没有提供value
    1. 组件使用自身的setInnerValue响应用户输入,改变自身状态innerValue
    2. 如果父组件提供onChange,在setInnerValue同时触发onChange事件通知父组件
  3. 如果父组件提供了value,组件失去了决定自身状态的能力(自身不会直接响应用户输入)
    1. 如果父组件提供onChange函数,则使用该函数响应用户输入
    2. 组件自身的setInnerValue不会响应用户输入(setInnerValue的作用是修改innerValue,因为有父组件的value,innerValue会响应value的变化,所以setInnerValue不应该直接修改innerValue导致其和value不一致)
function Input (props) {const [innerValue, setInnerValue] = useState(props.value);useEffect(() => {if ('value' in props) setInnerValue(props.value)}, [props.value])function handleChange (ev) {if (!('value' in props)) {setInnerValue(ev.target.value)}props.onChange?.(ev.target.value)}return <input value={innerValue} onChange={handleChange} />
}

【antd】输入控件的思想相关推荐

  1. INFO:InstallShield InstallScript工程中自定义界面文本输入控件的两个注意事项

    在使用InstallScript工程增加自定义界面过程中,我用到了文本输入控件(Edit Field),用于用户名和密码的输入. 首先是用户名,如果用户名长度超过我的控件长度时,发现无法再继续输入内容 ...

  2. WPF IP地址输入控件的实现

    WPF IP地址输入控件的实现 原文:WPF IP地址输入控件的实现 一.前言 WPF没有内置IP地址输入控件,因此我们需要通过自己定义实现. 我们先看一下IP地址输入控件有什么特性: 输满三个数字焦 ...

  3. 正则表达式——WPF输入控件TextBox 限定输入特定字符

    正则表达式--WPF输入控件TextBox 限定输入特定字符 原文:正则表达式--WPF输入控件TextBox 限定输入特定字符 概念: 正则表达式是对字符串操作的一种逻辑公式, 就是用事先定义好的一 ...

  4. jquery-文档操作-标签取值-输入控件取值与赋值

    html 文本 值 获取标签包裹的内容 dom的属性 jquery的方法 演练 小结 dom对象,jquery对象,取值方式的对等 对象 纯文本 html文本 dom innerText innerH ...

  5. 一起学Windows Phone7开发(十三.三 输入控件)

    在Phone7中主要的输入控件其实就有两个,一个是textbox,另一个就是password控件.这两个控件中尤其是TextBox控件有了很多新特性. 一.PasswordBox:   密码框控件,用 ...

  6. 给大家介绍一个日期输入控件javascript实现,我修改了下,符合我的习惯了,^_^!...

    最终效果如图: <formname="form1"method="post"action=""> <p> <i ...

  7. php支付密码控件,Android高仿微信支付密码输入控件实例代码

    这篇文章主要为大家详细介绍了Android高仿微信支付密码输入控件的具体实现代码,供大家参考,具体内容如下 像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现 ...

  8. ExtJS4.2学习(17)表单基本输入控件Ext.form.Field(转)

    鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-12-11/189.html --------------- ...

  9. 创建输入控件(input控件、文本框、密码框、单项选择、多项选择、重置与提交按钮的设置)

    创建输入控件 input控件的相关概念 input控件的属性 input控件的类型 文本框的设置 密码框的设置 单项选择的设置 多项选择的设置 重置与提交按钮的设置 综合运用 相关概念选择题及参考答案 ...

最新文章

  1. python中关于input和raw_input的使用方法
  2. JSP怎么将表单提交到对应的servlet
  3. Reflection,Regular Expression,Threading,IO,AppDomain,Web Service/Remoting Service,ORM
  4. Eclipse CDT Hello World工程makefile分析
  5. 如何在ui5 xml view中使用嵌入的自定义css style
  6. Linux Shell——-if -eq,if -ne,if -gt[笔记]
  7. 高质高效软件开发组织能力模型
  8. 计算机二级法律一班题目,湖南省计算机二级考试  程序设计题目精选30道
  9. A - Cube Stacking(带权并查集)
  10. java并发之线程安全---java并发编程实践
  11. phonegap文件上传(java_php),Android应用开发之使用PhoneGap实现位置上报功能
  12. cocos2d-x 粒子编辑器和使用
  13. 51单片机入门(4)蜂鸣器(无源+有源)
  14. 计算机切换用户界面,win7系统登录界面切换用户的方法
  15. KGB知识图谱凭借OCR文字识别突破文档解析局限
  16. Android 九宫格图片展示的实现
  17. 无需注册账号从官网下载VMware Workstation
  18. C语言中的char用法
  19. 科学动画制作工具——Blender
  20. linux系统重装win7 磁盘格式为gpt,怎么更改为,win10改win7怎么将硬盘格式由gpt转mbr?...

热门文章

  1. Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1
  2. 201521123032 《Java程序设计》第7周学习总结
  3. HDU-4527 小明系列故事——玩转十滴水 模拟
  4. mysql my.cnf在哪里_my.cnf配置文件在哪
  5. wxpython下载缓慢_我可以在wxPython的wx.grid.Grid中加速优化GridCellAttr的使用吗?
  6. “引用作为函数参数”与 “引用作为函数返回值”
  7. python中能够处理的最大整数是_实例讲解Python中整数的最大值输出
  8. C如何将二维数组作为返回值
  9. linux ftp解压命令 cannot fid or open,Linux环境搭建及常用shell命令集锦
  10. java rx.observable_Rxjava2 Observable的条件操作符详解及实例