React实现双向绑定示例代码


Posted in Javascript onSeptember 19, 2016

前言

React.js现在已经很流行了,不会React.js都不好意思说自己会前端了。

那么下面就来看看关于React双向绑定的实现。

双向绑定的使用:

组件需要mixins:引用LinkedStateMixin。它提供一个linkState方法。

参数是state属性

双向绑定用valueLink={this.linkState(XX)}

linkState方法返回一个对象,有一个value属性,指定state的属性。

还有一个requestChange回调方法,用来实现state的修改。参数是新值

可以理解成onchange的绑定方法。可以自己写一个linkState对象,value是state.XX requestChange里用setState()来修改值。用valueLink={obj}来实现。

可以理解成this.linkState()实现的就是指定绑定值value 和change方法

valueLink属性实现了linkstate.value绑定到value requestChange方法绑定onChange

可以创建一个this.linkState('XX') value={XX.value} onchange={fn}方法内使用Xx.requestChange(e.target.value)

-------------------------

小结:linkState()方法提供state属性和change方法。valueLink={}来实现value 和change事件的绑定。

以下是实现代码

/*默认表单双向绑定
   * 给每个input绑定change事件来实现修改state
   * 如果标签多了一个个绑定肯定是不行的,
   * 所以react 给我个提示了reactLink来
   */
   var Box1=React.createClass({
   getInitialState:function(){
    return {
    name:'star',bool:true
    }
   },
   handlNameChange:function(event){
    this.setState({name:event.target.value});
   },handlboolChange:function(event){
    this.setState({bool:event.target.checked})
   },
   render:function(){
    return (
    <div>
     <input type="text" value={this.state.name} onChange={this.handlNameChange}/>   <br/>
     <input type="checkbox" checked={this.state.bool} onChange={this.handlboolChange} />
    </div> 
    )
   }
   }) ;
   React.render(<Box1></Box1>,document.querySelector('#div1'));
   
   /*ReactLink仅是提供了onchange setState模式的简单包装和约定。是其的简写方式
   * 1、需要mixins添加引用
   * 2、原先的value绑定换成valueLink。参数从this.state.XX换成this.linkState('XX')这样就可以了
   */
   /*ReactLink解析
   * LinkedStateMixin给组件添加一个linkState方法,参数是state属性名。
   * 它返回一个reactlink对象,包含state当前值和一个改变值 的回调.
   * reactlink 可以在组件间通过props传递
   */
   var Box2=React.createClass({
   mixins:[React.addons.LinkedStateMixin],//添加引用
   getInitialState:function(){
    return {
    name:'star',bool:true
    }
   },
   render:function(){//绑定时属性从value换成valueLink值需要用this.linkState方法调用
    return (
    <div>
     <input type="text" valueLink={this.linkState('name')} />   <br/>
     <input type="checkbox" checkedLink={this.linkState('bool')} />
    </div>   
    );
   }
   })
   React.render(<Box2></Box2>,document.querySelector('#div2'));
   
   /*底层原理
   * reactlink对象其实就一个value属性,和一个requestChange方法,value值 是state。方法实现修改state值
   * 
   */
   var Box3=React.createClass({
   getInitialState:function(){
    return {
    name:'star',bool:true
    }
   },
   handlnamechange:function(val){
    this.setState({name:val})
   },
   handlboolchange:function(val){
    this.setState({bool:val})
   },
   render:function(){
    var reactlink={
    value:this.state.name,
    requestChange:this.handlnamechange
    }
    var reactlink2={
    value:this.state.bool,
    requestChange:this.handlboolchange
    }
     return(
      <div>
     <input type="text" valueLink={reactlink} />   <br/>
     <input type="checkbox" checkedLink={reactlink2} />
    </div> 
     )
   }
   });
   React.render(<Box3></Box3>,document.querySelector('#div3'));
   
   /*valuelink
   * 它实际上实现的是状态的绑定和change事件的修改
   * requestChange方法接收值来实现state的修改
   */
   var Box4=React.createClass({
   mixins:[React.addons.LinkedStateMixin],//添加引用
   getInitialState:function(){
    return {
    name:'star',bool:true
    }
   },
   render:function(){
    var valuelink=this.linkState('name');
    var handlenamechange=function(e){
      valuelink.requestChange(e.target.value) 
    }
    var valuelink2=this.linkState('bool');
    var handlenboolchange=function(e){
      valuelink2.requestChange(e.target.checked) 
    }    
    return (
      <div>
     <input type="text" value={valuelink.value} onChange={handlenamechange} />   <br/>
     <input type="checkbox" checked={valuelink2.value} onChange={handlenboolchange} />
    </div> 
    )
   }
   });
   React.render(<Box4></Box4>,document.querySelector('#div4'));

------------------------ReactLink对象传递

可以向子组件传递:

linkname={this.linkState('name')}

子组件内可:

<input type="text" valueLink={this.props.linkname} >

通过props来引用并绑定到valueLink上。

也可以用this.props.linkname.requestChange()来用方法修改值 。

它们的变化 会同步到父组件的。并更新标签的。

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能有所帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
使用ExtJS技术实现的拖动树结点
Aug 05 Javascript
javascript 延迟加载技术(lazyload)简单实现
Jan 17 Javascript
JavaScript中的正则表达式简明总结
Apr 04 Javascript
利用js的闭包原理做对象封装及调用方法
Apr 07 Javascript
iscroll实现下拉刷新功能
Jul 18 Javascript
Vue2 SSR渲染根据不同页面修改 meta
Nov 20 Javascript
vue按需加载组件webpack require.ensure的方法
Dec 13 Javascript
JavaScript同源策略和跨域访问实例详解
Apr 03 Javascript
微信小程序上传图片实例
May 28 Javascript
JS实现的新闻列表自动滚动效果示例
Jan 30 Javascript
原生js实现获取form表单数据代码实例
Mar 27 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
Nov 25 Javascript
vue从使用到源码实现教程详解
Sep 19 #Javascript
浅谈js内置对象Math的属性和方法(推荐)
Sep 19 #Javascript
jquery事件绑定解绑机制源码解析
Sep 19 #Javascript
JavaScript学习笔记整理_setTimeout的应用
Sep 19 #Javascript
Node.js + Redis Sorted Set实现任务队列
Sep 19 #Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
Sep 19 #Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
Sep 19 #Javascript
You might like
ADODB的数据库封包程序库
2006/12/31 PHP
php Undefined index的问题
2009/06/01 PHP
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
php递归删除目录与文件的方法
2015/01/30 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
vue实现点击关注后及时更新列表功能
2018/06/26 Javascript
webpack HappyPack实战详解
2019/10/08 Javascript
javascript实现超好看的3D烟花特效
2020/01/01 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
Python去除列表中重复元素的方法
2015/03/20 Python
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
python学生管理系统
2019/01/30 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
python利用JMeter测试Tornado的多线程
2020/01/12 Python
PHP基于phpqrcode类库生成二维码过程解析
2020/05/28 Python
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
2014/02/10 HTML / CSS
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
Cult Gaia官网:美国生活方式品牌
2019/08/16 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
工商管理专业应届生求职信
2013/11/04 职场文书
新品发布会策划方案
2014/06/08 职场文书
财会专业毕业生自荐信
2014/07/09 职场文书
学生保证书格式
2015/02/27 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL