【React学习笔记】React的双向绑定(React State)
1、什么是双向绑定、为什么需要双向绑定?
本人是先入坑的vue,所以在开发时已经习惯了vue的自动双向绑定。
什么是双向绑定呢?
在没有前端框架之前的开发时光中,我们都是直接操作页面的DOM元素(element)的。将某个变量赋值到某个页面元素时都是一次性的操作,在此之后变量值的修改并不会影响页面元素的内容变化;而页面元素(比如input框)的内容变更以后,也不会使对应变量的值发生变化,我们需要通过document.getElementById()
的方法获取到页面元素,然后再根据元素对象的value
获取变化以后的值再手动处理。
在vue中,框架已经帮我们自动实现了双向绑定,任何一方(哪怕是页面上纯显示的)也会自动变化。(以下代码中,变量name
的变化会直接反应到input框中,而input框中值得修改也会反向引起name
变量的值变化。)
<!-- Vue中一个最简单的双向绑定示例 --> <template> <div> <el-input v-model=“name” /> </div> </template> <script> export default { data() { return { name: "", } }, } </script>
而到了react,发现并没有双向绑定的功能,有点懊糟。
NameShow.js import React from 'react'; class NameShow extends React.Component { myName = "" // 定义myName变量 render() { return ( <div> {/*尝试将myName变量绑定到input框上*/} <input value={this.myName}/> {/*获取myName,并直接显示在页面上*/} <div>My Name Is {this.myName}</div> </div> ) } } export default NameShow
将以上组件引入APP中并添加到页面上启动,发现不仅无法双向绑定,甚至连修改input框的内容都没有任何反应,而且控制台有警告显示。大概的意思是value是只读的,值的修改必须通过onChange事件来修改。
所以添加一个onChange
事件的handle方法handleChange
以后再次启动。
NameShow.js import React from 'react'; class NameShow extends React.Component { myName = "" // 定义myName变量 handleChange = (event) => { // 此处需使用箭头函数,否则方法中的this将会识别为undefined console.log(event.target.value) this.myName = event.target.value } render() { return ( <div> {/*尝试将myName变量绑定到input框上*/} <input value={this.myName} onChange={this.handleChange}/> {/*获取myName,并直接显示在页面上*/} <div>My Name Is {this.myName}</div> </div> ) } } export default NameShow
在输入框中输入内容以后,发现控制台有反应,正常拿到了修改以后的值,但是输入框和下面显示的内容却依旧没有变化。
2、React不支持双向绑定?非也
react并不是不支持双向绑定,而是双向绑定需要我们自己来实现。这时候就是react中的一个重要概念登场了——React State。
在菜鸟教程中的解释是这样的:React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。
现在回到上面那个例子,进行一下改造,由使用类成员变量myName
改为使用state
中的myName
变量。
NameShow2.js import React from 'react'; class NameShow2 extends React.Component { constructor(props) { super(props); this.state = { // 注意1:此处需先对state进行初始化,不然编译会报错 myName: "" // 注意2:此处需要将变量在state中进行定义,否则会报警告 } } handleChange = (event) => { console.log(event.target.value) // this.state.myName = event.target.value // 注意3:此处直接赋值是无效的,一定要使用this的setState方法 this.setState( {myName: event.target.value} ) } render() { return ( <div> {/*尝试将myName变量绑定到input框上*/} <input value={this.state.myName} onChange={this.handleChange}/> {/*获取myName,并直接显示在页面上*/} <div>My Name Is {this.state.myName}</div> </div> ) } } export default NameShow2
将以上组件引入APP中并添加到页面上启动,并在input框填入内容,发现下面的显示也同步改变了,并且控制台也有输出。
到此,一个简单的react双向数据绑定的流程就完成了。
3、小结
-
在react中要实现数据的双向绑定,需要通过state来实现,
根据菜鸟解释,react将每个组件都定义为状态机,通过state来改变和控制组件的状态。
-
使用state之前需要先初始化,并且在state中定义所需要用到的变量,
这个类似于vue中使用前先要在
data
部分定义变量。(一般使用时可以不用预先定义变量,只有在变量绑定对象为
<input>
<textarea>
<select>
时才需要,具体内容可以参考react官网相关解释。) -
直接对state进行赋值是无效的,需要使用
setState
方法来赋值,这样才能触发状态的改变,从而达到值传递的效果。
另外补充一点,在上述两个例子中都将handleChange
方法都以箭头函数的方式进行定义,这是由于js的闭包导致的。
如果想将handleChange
定义为普通方法,可以在构造函数中将this
对象绑定到handleChange
方法
constructor(props) { super(props); this.state = { myName: "" } this.handleChange = this.handleChange.bind(this) // 将`this`对象绑定到`handleChange`方法 }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
不要再满世界搜linux命令了,我给你整理到一块了
前言 做为一位后端开发,怎能不会点Linux命令?总结了一套非常实用的Linux命令(基于CentOS 7.6),希望对大家有所帮助! 推荐一下自己的linuxC/C++交流群:973961276!整理了一些个人觉得比较好的学习书籍、视频资料以及大厂面经视频共享在群文件里面,有需要的小伙伴可以自行添加哦!~ 缺乏项目实战经验和想转行学编程的朋友看这里>>零基础c/c++入门到企业级项目实战 系统服务管理 systemctl systemctl命令是 service和 chkconfig命令的组合体,可用于管理系统。 输出系统中各个服务的状态: systemctl list-units --type=service 查看服务的运行状态: systemctl status firewalld 关闭服务: systemctl stop firewalld 启动服务: systemctl start firewalld 重新启动服务(不管当前服务是启动还是关闭): systemctl restart firewalld 重新载入配置信息而不中断服务...
- 下一篇
DevOps和它的朋友们——聊聊其他 “Ops”(一)
DevOps不仅仅是将敏捷开发概念与IT运维相结合,还简化了在云环境中开发和部署应用程序的过程,从而使开发生命周期大大缩短。这就是DevOps作为一种开发方法流行的原因。 即使在今天,DevOps仍然是大多数优化管道的核心。持续交付变成了规范,而不是要实现的目标。应用的开发是迭代的,新的更新被推送到云端,用zero down代替部分或整个环境。因为有了DevOps,即使是大型的多部分更新也更加易于管理。 然而,就结合软件开发和IT运维而言,DevOps这个术语并非唯一。它有着许多变体和子类型——以及概念的修改——它们被不同的软件开发团队广泛采用。对于许多人来说,DevOps为跨团队的良好流程(包括自动化)奠定了基础。但是为了改进方法论,团队可以采用下面的一种或多种主要方法——因为大多数被考虑的方法都是为了实现“更好的”DevOps文化而进行的调整。 那么,其他需要考虑的“Ops”是什么呢?它们与DevOps相比如何? DevOps vs. NoOps NoOps背后的方法是以一种不需要内部团队进行操作的方式来自动化IT基础设施。在这种方法中,操作团队的所有维护和类似任务都是完全自动化的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Hadoop3单机部署,实现最简伪集群