React利用插件和不用插件实现双向绑定的方法详解


Posted in Javascript onJuly 03, 2017

前言

以前对于双向绑定概念来自于Angular.js,现在我用我感兴趣的react.js来实现这样的方式。

有2种方式分析,1:不用插件,2:用插件

(引入react.js操作省略。。。)

不用插件:

先创建react组件

var NoLink = React.createClass({});

React.render(<NoLink />,document.body);

组件创建好了,需要一个初始化变量,来公用显示输入的数据

var NoLink = React.createClass({
 getInitialState:function(){
  return {message:''}
 }
});

React.render(<NoLink />,document.body);

message初始值为空,这是正常项目环境可以这样设置。下面我想用一个input输入框 和一个b标签实现双向绑定的效果,render所需要的html标签

var NoLink = React.createClass({
 getInitialState:function(){
  return {message:''}
 },
 render:function(){
  var mess = this.state.message;
  return (
   <div>
    <input type="text" onChange={this.handelChange} value={mess} />
    <b>{mess}</b>
   </div>
  )
 }
});
React.render(<NoLink />,document.body);

在上面代码中 可以清晰的 看出返回的组件元素,其中在input输入框中加了一个onChange操作,这个处理当我们输入内容的时候,怎么让输入的内容同时展示在b标签中;在react操作中其实很简单。

var NoLink = React.createClass({
 getInitialState:function(){
  return {message:''}
 },
 handelChange:function(event){
  console.log(event.target);
  this.setState({message:event.target.value})
 },
 render:function(){
  var mess = this.state.message;
  return (
   <div>
    <input type="text" onChange={this.handelChange} value={mess} />
    <b>{mess}</b>
   </div>
  )
 }
});

React.render(<NoLink />,document.body);

onChange直接调用handelChange函数,在这只要处理对初始化变量message的重新赋值就可以了,在react中获取初始值 直接用“this.state.初始值",如果想设置初始值直接用"this.setState({初始值:新值}) ",这个点先理清楚了我需要设置初始值,然后呢

我的输入值怎么直接管理到setState中去,当我onChange={this.handelChange}时候就开始应用handelChange函数了在这里通过event.target可以直接获取当前dom元素对象,因为我在这里用input,获取其值的方式".value"就可以了。

我在render的时候定义了mess变量来存放初始化message的值,这个js写法,懂得js性能的人一看就明白了,不多说。看下在浏览器的操作:

React利用插件和不用插件实现双向绑定的方法详解

接下来换种方式:用插件形式

用插件:

react.js给我们提供了linkState函数,但这个函数来自于React.addons.LinkedStateMixin,首先看下源码的操作,先进入React.addons.js中去找LinkedStateMixin

React利用插件和不用插件实现双向绑定的方法详解

这里几个对象就是这个addons.js中提供的所有操作,有重要的react动画插件CSSTransitionGroup包含其中。接下来我们这次需要linkedStateMixin所以走到这个对象中去看看:

React利用插件和不用插件实现双向绑定的方法详解

在这里只提供了linkState函数,直接返回一个ReactLink对象,把参数直接给ReactLink对象去做处理。

主要这个东西怎么用在实例中,先创建一个react组件

var ReactLink = React.createClass({});


React.render(<ReactLink />,document.body);

接下来思考,在这个组件中我们怎么引入外面对象,react.js提供了一个mixins的函数,要是引用对象多了直接以数组形式展现;其源码如图

React利用插件和不用插件实现双向绑定的方法详解

在组件中直接这样使用即可:

var ReactLink = React.createClass({
 //引用公共插件linkedStateMixin
 mixins:[React.addons.LinkedStateMixin]
});


React.render(<ReactLink />,document.body);

linkedStateMixin是拿到了,现在我们要做的是怎么在定义的vdom上使用,在源码中我看到this.props.valueLink  这样的形式,说明在虚拟dom元素中加入valueLink才能使用,

var ReactLink = React.createClass({
 //引用公共插件linkedStateMixin
 mixins:[React.addons.LinkedStateMixin],
 getInitialState:function(){
  return {message:''}
 },
 render:function(){
  return (
    <div>
     <input type="text" valueLink = {this.linkState('message')}/>
     <b>{this.state.message}</b>
    </div>
  )
 }
});


React.render(<ReactLink />,document.body);

上面的写法也是最简洁的写法,直接将初始化变量message传给linkState函数中去,然后react插件源码先获取的虚拟dom中的valueLink属性再进行操作。

用这样形式写好了 试一下效果:

React利用插件和不用插件实现双向绑定的方法详解

完全OK.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JSQL SQLProxy 的 php 版本代码
May 05 Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
Mar 19 Javascript
一个实用的图片切换支持点击切换和自动轮播
Sep 09 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
Dec 24 Javascript
JavaScript模拟数组合并concat
Mar 06 Javascript
AngularJS利用Controller完成URL跳转
Aug 09 Javascript
Angular 4.x 动态创建表单实例
Apr 25 Javascript
jquery tmpl模板(实例讲解)
Sep 02 jQuery
利用nginx + node在阿里云部署https的步骤详解
Dec 19 Javascript
微信小程序手动添加收货地址省市区联动
May 18 Javascript
Javascript新手入门之字符串拼接与变量的应用
Dec 03 Javascript
使用这 6个Vue加载动画库来减少我们网站的跳出率
May 18 Vue.js
解决webpack -p压缩打包react报语法错误的方法
Jul 03 #Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
Jul 03 #Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
Jul 03 #Javascript
微信小程序开发中的疑问解答汇总
Jul 03 #Javascript
JavaScript之promise_动力节点Java学院整理
Jul 03 #Javascript
JavaScript之DOM_动力节点Java学院整理
Jul 03 #Javascript
javaScript中封装的各种写法示例(推荐)
Jul 03 #Javascript
You might like
php获取访问者IP地址汇总
2015/04/24 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
有趣的JavaScript数组长度问题代码说明
2011/01/20 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
jquery实现鼠标滑过后动态图片提示效果实例
2015/08/10 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
避免jQuery名字冲突 noConflict()方法
2016/07/30 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
nodejs基础知识
2017/02/03 NodeJs
vue-dialog的弹出层组件
2020/05/25 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
Python发送Email方法实例
2014/08/21 Python
python写xml文件的操作实例
2014/10/05 Python
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
工程总经理工作职责
2013/12/09 职场文书
高中生的自我鉴定范文
2014/01/24 职场文书
大学感恩节活动策划方案
2014/10/11 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
销售合作意向书范本
2015/05/08 职场文书
Redis如何一键部署脚本
2021/04/12 Redis
讲解MySQL增删改操作
2022/05/06 MySQL