博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React中的表单组件
阅读量:5960 次
发布时间:2019-06-19

本文共 2666 字,大约阅读时间需要 8 分钟。

表单是前端非常重要的一块内容,并且往往包含了错误校验等逻辑。

React对表单元素做了专门的优化处理,他对表单元素做了一些抽象,使得他们的使用方式更统一更规范。

约束性和非约束性组件

表单里面出来了一个新的概念叫“约束性组件”。那么如何理解约束性组件和非约束性组件呢。

约束性组件,简单的说,就是由React管理了它的value,而非约束性组件的value就是原生的DOM管理的。

他们的写法上也有很大区别。

非约束性组件这么写:

这个 defaultValue 其实就是原生DOM中的 value 属性。这样写出的来的组件,其value值就是用户输入的内容,React完全不管理输入的过程。

而约束性组件是这么写的:

//...省略部分代码handleChange: function(e) {  this.setState({name: e.target.value});}

这里,value属性不再是一个写死的值,他是 this.state.name,而 this.state.name 是由 this.handleChange 负责管理的。

这个时候实际上 input 的 value 根本不是用户输入的内容。而是onChange 事件触发之后,由于 this.setState 导致了一次重新渲染。不过React会优化这个渲染过程,实际它依然是通过设置input的value来实现的。

但是一定要注意,约束性组件显示的值和用户输入的值虽然很多时候是相同的,但他们根本是两码事。约束性组件显示的是 this.state.name 的值。你可以在handleChange中对用户输入的值做任意的处理,比如你可以做错误校验。

对比约束性组件和非约束性组件的输入流程:

非约束性组件: 用户输入A -> input 中显示A

约束性组件: 用户输入A -> 触发onChange事件 -> handleChange 中设置 state.name = “A” -> 渲染input使他的value变成A
正式因为这样,强烈推荐使用约束性组件,因为它能更好的控制组件的生命流程。

更统一和更规范的接口

React 把 input,textarea 和 select 三个组件做了抽象和封装,他们的用法变得非常统一,你基本上可以当做同一个组件来用。

他们现在有统一的 value 属性 和 onChange 事件,现在对于这三种组件你都可以这样写

不过 chekbox有和上面三个不一样,因为checkbox改变的不是 value ,而是 checked 状态。

你可以这样写:

一个示例

下面是一个包含了 input,textarea, select, radio 的表单,并且做了简单的校验:

var MyForm = React.createClass({    getInitialState: function() {      return {        email: "",        intro: "",        city: "hz",        male: true, //性别        emailError: "",        introError: ""      };    },    handleEmail: function(e) {      var value = e.target.value;      var error = '';      if(!(/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(value))) {        error = '请输入正确的Email';      }      this.setState({        email: value,        emailError: error      });    },    handleIntro: function(e) {      var value = e.target.value;      var error = "";      if(value.length < 10) {        error = "介绍不能少于十个字";      }      this.setState({        intro: value,        introError: error      });    },    handleCity: function(e) {      var value = e.target.value;      this.setState({        city: value,      });    },    handleGender: function(e) {      var male = !!(e.target.value == 'MALE');      this.setState({        male: male      });    },    render: function() {      return (        

{this.state.emailError}

{this.state.introError}

) } }); React.render(
, document.getElementById("div1") );

转载地址:http://pkyax.baihongyu.com/

你可能感兴趣的文章
单元测试基本路径覆盖法(转)
查看>>
十三、栅栏CyclicBarrier
查看>>
简单搭配(Collocation)隐私声明
查看>>
2013编程之美资格赛【传话游戏】
查看>>
关于Dictionary的线程安全问题
查看>>
在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析
查看>>
CentOS6.5+mysql5.1源码安装过程
查看>>
Js 笔记
查看>>
C++: find()函数的注意事项
查看>>
js的事件学习笔记
查看>>
leetcode 【 Add Two Numbers 】 python 实现
查看>>
Android接收系统广播
查看>>
将网络中的图片存为NSData并保存到sqlite的BLOB字段中
查看>>
Cocos2d-js-v3.2 在 mac 上配置环境以及编译到 Andorid 的注意事项(转)
查看>>
iOS用三种途径实现一方法有多个返回值
查看>>
python--class test
查看>>
从零开始理解JAVA事件处理机制(3)
查看>>
HttpURLConnection类的使用
查看>>
linux命令分析---SED (二)
查看>>
[INS-32025] 所选安装与指定 Oracle 主目录中已安装的软件冲突。
查看>>