在React中,所谓受控组件和非受控组件,是针对表单而言的。

表单受控组件

  • 表单元素依赖于状态,表单元素需要默认值实时映射到状态的时候,就是受控组件,这个和双向绑定相似.
  • 受控组件,表单元素的修改会实时映射到状态值上,此时就可以对输入的内容进行校验.
  • 受控组件只有继承React.Component才会有状态.
  • 受控组件必须要在表单上使用onChange事件来绑定对应的事件.
class Control extends React.Component {// 这样的写法也是声明在实例上的对象state = {// 给组件状态设置默认值,在实时修改时进行校验username: "zf",pwd: "123"}// e为原生的事件绑定对象handleChange = (e) => {// 获取原生对象上的属性let name = e.target.name;// 根据表单元素的name名称进行匹配,比如用户名的name是username,那新输入的值将更新原来的值this.setState({[name]: e.target.value})}render() {return (<div><p>{this.state.username}</p>用户名:<inputname="username"type="text"value={this.state.username}onChange={this.handleChange} /> <br /><p>{this.state.pwd}</p>密码:<inputname="pwd"type="text"value={this.state.pwd}onChange={this.handleChange} /> <br /></div>)}
}复制代码

受控组件显示结果

怎么样,这个效果是不是和双向绑定很相似?

注意:

  • 在受控组件中,如果没有给输入框绑定onChange事件,将会收到react的警告
  • 并且此时输入框除了默认值,是无法输入其他任何参数的
class Control extends React.Component {constructor() {super();this.state = {username: "zds",age: 10}}render() {return (<div>username:<inputtype="text"name="username"value={this.state.username} /><br />age:<inputtype="text"name="age"value={this.state.age} /></div>)}
}
复制代码

结果可以从如下图中看出:

  • 输入框没有绑定onChange事件无法修改输入框中的值
  • 会触发react警告

非受控组件

  • 非受控组件即不受状态的控制,获取数据就是相当于操作DOM。
  • 非受控组件的好处是很容易和第三方组件结合。

获取输入框中的值的两种方法

  • ref 功能是一样,只是写法不一样,可以让我们操作DOM

第一种方式是函数

  • 在虚拟DOM节点上使用ref,并使用函数,将函数的参数挂载到实例的属性上
handleSubmit = (e) => {// 阻止原生默认事件的触发e.preventDefault();console.log(this.username.value);
}
render() {return (<form onSubmit={this.handleSubmit}>{/* 将真实的DOM,username是输入框中输入的值赋值给组件实例上这样,在页面表单提交的时候就可以通过this.username.value获取到输入框输入的值*/}用户名<inputname="username"type="text"ref={username=>this.username=username}/><br /></form>)
}
复制代码

现在我们来看看第一种非受控方式是如何获取输入框中的值的:

第二种方式:通过构造函数声明的方式

  • react 16.3新语法
  • 实例的构造函数constructor这创建一个引用
  • 在虚拟DOM节点上声明一个ref属性,并且将创建好的引用赋值给这个ref属性
  • react会自动将输入框中输入的值放在实例的second属性上
constructor(){super();// 在构造函数中创建一个引用this.second=React.createRef();
}
handleSubmit = (e) => {// 阻止原生默认事件的触发e.preventDefault();console.log(this.second.current.value);
}
render() {return (<form onSubmit={this.handleSubmit}>{/* 自动将输入框中输入的值放在实例的second属性上 */}密码<inputname="password"type="text"ref={this.second}/><br /></form>)
}
复制代码

现在我们来看看第二种非受控方式是如何获取输入框中的值的:

好了,react关于表单的受控组件和非受控组件就先整理到这里,有问题的话,欢迎大家留言沟通!

作者:tenor

原文发布时间:2018年06月29日
本文来源掘金如需转载请紧急联系作者

React 之受控组件和非受控组件相关推荐

  1. [react] 受控组件和非受控组件有什么区别?

    [react] 受控组件和非受控组件有什么区别? 受控组件用value和组件的state绑定,当value更新时,会自动更新state 非受控组件没有value,采用ref直接操作dom 个人简介 我 ...

  2. 深入react技术栈(10):受控组件和非受控组件

    我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣 受控组件 非受控组件 受控组件和非受控组件的区别 文章参考深入React技术栈

  3. React中受控组件和非受控组件

    受控组件 在React中,每当表单的状态发生变化时,都会被写入到组件的state中,这种组件在React被称为受控组件.受控组件中,组件渲染的状态与它的value或者checked相对应.React通 ...

  4. 【React】之受控组件和非受控组件

    React中的组件根据是否受React控制可分为受控的和非受控的. 一.受控组件 表单元素依赖于状态,表单元素需要默认值实时映射到状态的时候,就是受控组件,这个和双向绑定相似. 受控组件,表单元素的修 ...

  5. React的受控组件和非受控组件

    一.受控组件 表单元素依赖于状态,表单元素需要默认值实时映射到状态的时候,就是受控组件,这个和双向绑定相似. 受控组件,表单元素的修改会实时映射到状态值上,此时就可以对输入的内容进行校验. 受控组件只 ...

  6. 【React】知识点归纳:受控组件与非受控组件区别

    React: 受控组件与非受控组件区别 受控组件 示范代码: 原理图: 非受控组件 示范代码: 结论 受控组件 在HTML中,标签<input>.<textarea>.< ...

  7. 什么是React受控组件和非受控组件

    React是一个非常流行的JavaScript库,用于构建Web应用程序.React中有两种类型的组件,受控组件和非受控组件.在本文中,我们将深入研究这两种组件的区别,优缺点以及如何选择适当的组件类型 ...

  8. React 的受控组件和非受控组件有什么不同

    大家好,我是前端西瓜哥,今天我们来看看 React 的受控组件和非受控组件有什么不同. 受控组件 受控组件,指的是将表单元素的值交给组件的 state 来保存. 例子: import './style ...

  9. react——非受控组件和非受控组件的应用

    非受控组件和非受控组件的应用 什么是非受控组件: 非受控组件:它应用的次数没有受控组件多,在工作中,多数使用为受控组件 非受控组件:表单项中的value或checked值,它不受state中的属性控制 ...

最新文章

  1. CVPR2021(Oral) 商汤、港中文实现单目人脸重建新突破: 基于生成网络的渲染器!几何形状更精准!渲染效果更真实!...
  2. dSploitzANTI渗透教程之安装zANTI工具
  3. 每天一道LeetCode-----寻找给定字符串中重复出现的子串
  4. RBAC模型:表设计分析
  5. [postgresql]postgresql的VACUUM 介绍
  6. 兄弟连关于PHP培训的声明
  7. Hystrix原理介绍:服务雪崩、断路器、服务降级、资源隔离-《Spring Cloud微服务架构进阶》读书笔记
  8. html语言制作静态网页,html+css制作的漂亮静态网页
  9. 【EXLIBRIS】#小词旮旯# 003 Comrade
  10. 《周一清晨的领导课》读书笔记
  11. vue图片时间轴滑动_在vue2.0 中制作时间轴拖动组件
  12. c语言aps审核,APS考官最讨厌的几类人
  13. maven的下载安装,setting.xml配置教程,Idea 配置maven
  14. confluence 配置
  15. Hadoop基础-10-YARN
  16. 【黄啊码】MySQL入门—3、我用select *,老板直接赶我坐火车回家去,买的还是站票
  17. h264 sei信息 解码_关于H264编码数据中SPS,PPS,SEI,IDR等内容的问题
  18. python3中编解码、进制、字节、bytes及爬虫中经常遇到的编码问题的总结
  19. Python学习——(2)通过网络爬虫获取数据
  20. iphone 12屏幕材质 iPhone12尺寸多大

热门文章

  1. 《iOS面试之道》算法基础学习(上)
  2. 2018年预测:GPU数据库或是未来的数据库统治者!
  3. Dapper实用教程
  4. Spring Boot——2分钟构建spring web mvc REST风格HelloWorld
  5. 开始gentoo之旅
  6. 27个提升效率的iOS开源库推荐
  7. docker中如何制作自己的基础镜像
  8. 【Windows Phone设计与用户体验】关于移动产品的Loading用户体验的思考
  9. iOS开发 mac证书无法展开
  10. android天气预报----google开源天气API,SAX解析