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 相关文章推荐
简单的js分页脚本
May 21 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
Aug 06 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
Dec 31 Javascript
JS保留两位小数,多位小数的示例代码
Jan 07 Javascript
Javascript基础_标记文字的实现方法
Jun 14 Javascript
适用于手机端的jQuery图片滑块动画
Dec 09 Javascript
javascript自定义事件功能与用法实例分析
Nov 08 Javascript
webpack写jquery插件的环境配置
Dec 21 jQuery
JS脚本实现网页自动秒杀点击
Jan 11 Javascript
深入理解Vue nextTick 机制
Apr 28 Javascript
React 使用recharts实现散点地图的示例代码
Dec 07 Javascript
前端vue+express实现文件的上传下载示例
Feb 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网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
详解PHP原生DOM对象操作XML的方法
2016/10/17 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
Angular实现form自动布局
2016/01/28 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
js实现下一页页码效果
2017/03/07 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
vue之延时刷新实例
2019/11/14 Javascript
详细分析vue响应式原理
2020/06/22 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
2020/09/02 Javascript
python 解析html之BeautifulSoup
2009/07/07 Python
python标准日志模块logging的使用方法
2013/11/01 Python
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
Django Admin 实现外键过滤的方法
2017/09/29 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
python 对key为时间的dict排序方法
2018/10/17 Python
浅析python的优势和不足之处
2018/11/20 Python
Django框架实现分页显示内容的方法详解
2019/05/10 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
2019/10/22 Python
pytorch进行上采样的种类实例
2020/02/18 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
浅谈python锁与死锁问题
2020/08/14 Python
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
什么是.net的Remoting技术
2016/07/08 面试题
竞选班长的演讲稿
2014/04/24 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers
数据库连接池
2021/04/06 MySQL
MySQL update set 和 and的区别
2021/05/08 MySQL