wordpress表单数据验证_React 基础:受控和非受控组件的总结(表单)

3b70f4ef226dd1bb8d8146da80621a68.png

前言

这系列是 React 基础教程(参考 React 官网),记录了自己入门学习 React 的笔记。不太适合有 React 丰富经验的同学,但希望看到此文的你,多少都有些收获。

文章代码均可在我的码云中找到:https://gitee.com/eminoda/react-learn/branches

为了更好的阅读体验,可在底下的“了解更多”查看原文(我的语雀知识库)。

受控组件

表单元素(input、textarea、select 等)涉及输入/显示数据,一般用 state 来定义,并通过 setState 来更新。

就这样在 React 保证了一定的更新机制,这种控制表单元素的方式称为:"受控组件"。

说白了就是将表单数据交付给 React 的 state 来管理。

下面示例这些标签用法:


input

input 通过 onChange 触发事件,从 event 中拿到输入的值:

1630adc10bf2bae0035aa089d576ca5e.png

将该值设置到 state 对象中:

ddbb56f0019ab8ed1cd4908dab0348b3.png

页面效果:

6b91631c203199f20ac51faae6ab2875.gif

textarea

注意的是,为了和 input 和一样使用的方式,也在 textarea 中设置了 value 属性。

52aeac10b8febfd94e01b9e94ff557e0.png

select

select 会略复杂,设计 options 选项的初始化定义,以及当前选项的定义。

94dc05088acd7a362fa9dfbbfceaf632.png

通过遍历,定义 option 的 JSX 模板:

4803c4c5242d60b1ee13aedaa09d3c30.png

页面效果:

6985d4bdd85ea20c7758caae49468ed8.gif

多 input 事件触发的封装

模拟一个稍稍复杂的表单,里面会有几个 input 元素。试想,如果每个 input 上定义一个事件函数,那将多冗余。

所以就有了如下使用方式,针对多 input 情况下的表单:

9b0d9d6f1ad6d6073fd9837187949018.png

能看到表单的 JSX 模板上,定义了相同的事件函数 handleMultipleInput ,为了区分 input ,定义了不同的 name 属性:

282de017b6a925535d1372c385c2539b.png

最后通过统一的处理,来完成对这个表单数据对象的修改更新:

2720abe82ac03b4fa886342d07c357db.png

当然还有中需求,可能会对表单有些历史数据的回填,下面是示例:

比如,初始数据要对 sex 默认选中 female:

77a852b482f36487e830aeddffa7dcaf.png

就要对模板这样修改:

524712d6f89412b28cb2def6355baa00.png

事件中,有针对性的判断:

f6cfb017440ea15f26713f94352e8a81.png

非受控组件

用法示例

如果了解 React 的 Ref 引用,那么就知道我们可以通过 Ref 的方式,直接获取 Dom 节点的引用,然后对表单的数据进行操作。

示例:

初始化 Ref :

e7c3f9153deda58dbf960a8d6ff9ad8d.png

将 Ref 交给 ref 属性,由 React 来对 Ref 进行 Dom 赋值:

17ffd5bc51e0aa2eda29755d2f59e5e2.png

测试:通过对应的事件方法,能实时获取到 input 输入的 value:

8179de1bfe75d02f9b633e45bc0342d7.png
c34f86538bc655a7c15b65a40d2f342d.gif

和"受控组件"不同,input 元素没有依靠 value={this.state.value} 这样的形式来显示数据。


初始化默认值

不像受控组件,可以在构造器中初始化 state 对象;对于非受控组件设置默认值需要其他方式:

fd8a06a3d58811aaa6cbf5840b831593.png

通过 defaultValue 来指定首次渲染的数据。针对 checkbox、radio 是 defaultChecked 来指定。

受控和非受控的区别

受控组件

利用 state 实现数据的同步显示,这样有助于 form 表单验证的提示;

以及表单一些特殊情况的设置(disabled、级联显示等)

非受控组件

而非受控组件不擅长上述需求的定制,可以说偏业务简单的需求。因为表单数据可以直接从引用拿到,而且不带"副作用"(不像受控组件拿到子组件的实例全部引用)

当然非受控组件不是那么"无用",比如像 input 的 file 类型,更是它使用的独特场景。因为此 input 需要显示的值,我们控制不了。

58b7f52861a3e6c4baa512f8aedd46bf.png

总结

像受控组件,某种程度和 vue 或者 angular 的 model 类似,都有双向绑定的特点。

不管使用受控,还是非受控,React 能单独分离出这两个概念,我感觉很新奇。相信随着日益丰富的经验,这两者的使用会越来越准确。

最后,个人看官方文档还没有看到类似指令 directive 概念的出现,毕竟指令是专门处理 DOM 操作的地方。

相反,React 通过 Refs 来专项处理 DOM 操作,虽然"简单暴力",但总感觉是硬凑上去的概念,尤其是 Refs 的转发(个人观点)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值