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 相关文章推荐
面向对象Javascript核心支持代码分享
May 23 Javascript
js中把JSON字符串转换成JSON对象最好的方法
Mar 21 Javascript
JavaScript自定义数组排序方法
Feb 12 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
Mar 13 Javascript
jQuery焦点图轮播效果实现方法
Dec 19 Javascript
微信小程序 简单教程实例详解
Jan 13 Javascript
jquery实现图片跟随鼠标的实例
Oct 17 jQuery
jQuery判断网页是否已经滚动到浏览器底部的实现方法
Oct 27 jQuery
vue实现a标签点击高亮方法
Mar 17 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
Mar 06 jQuery
Jquery高级应用Deferred对象原理及使用实例
May 28 jQuery
解决Vue项目中tff报错的问题
Oct 21 Javascript
解决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页面防重复提交方法总结
2013/11/25 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
javascript 二进制运算技巧解析
2012/11/27 Javascript
JS+CSS实现电子商务网站导航模板效果代码
2015/09/10 Javascript
Dojo获取下拉框的文本和值实例代码
2016/05/27 Javascript
避免jQuery名字冲突 noConflict()方法
2016/07/30 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
2016/08/11 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
javascript变量提升和闭包理解
2018/03/12 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
python装饰器与递归算法详解
2016/02/18 Python
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
python3.5使用tkinter制作记事本
2016/06/20 Python
Python装饰器用法实例总结
2018/05/26 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
详解python中的异常和文件读写
2021/01/03 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
财务副总经理工作职责
2013/11/25 职场文书
请假条范文大全
2014/04/10 职场文书
委托书格式范文
2015/01/28 职场文书
养成教育工作总结
2015/08/13 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
SpringRetry重试框架的具体使用
2021/07/25 Java/Android
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python
Mysql 文件配置解析介绍
2022/05/06 MySQL