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 相关文章推荐
JS的反射问题
Apr 07 Javascript
jQuery UI Dialog控件中的表单无法正常提交的解决方法
Dec 19 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
Aug 12 Javascript
简介JavaScript中的sub()方法的使用
Jun 08 Javascript
通过隐藏iframe实现无刷新上传文件操作
Mar 16 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
Jun 02 Javascript
javascript中href和replace的比较(详解)
Nov 25 Javascript
WebSocket实现简单客服聊天系统
May 12 Javascript
vue上传图片组件编写代码
Jul 26 Javascript
JS实现的JSON数组去重算法示例
Apr 11 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
微信小程序canvas截取任意形状的实现代码
Jan 13 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
一个PHP日历程序
2006/12/06 PHP
php代码把全角数字转为半角数字
2007/12/10 PHP
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
ThinkPHP中使用Ueditor富文本编辑器
2015/09/02 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
JS控制日期显示的小例子
2013/11/23 Javascript
Jquery实现侧边栏跟随滚动条固定(兼容IE6)
2014/04/02 Javascript
24款热门实用的jQuery插件推荐
2014/12/24 Javascript
js中hash和ico的关联分析
2015/02/05 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
javaScript中定义类或对象的五种方式总结
2016/12/04 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
[28:05]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第一场 10月30日
2020/10/31 DOTA
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
python统计cpu利用率的方法
2015/06/02 Python
Python中enumerate函数代码解析
2017/10/31 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
Python 中pandas索引切片读取数据缺失数据处理问题
2019/10/09 Python
浅谈Python中的继承
2020/06/19 Python
如何对python的字典进行排序
2020/06/19 Python
如何用Django处理gzip数据流
2021/01/29 Python
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
应届生英语教师求职信
2013/11/05 职场文书
大学本科毕业生求职信范文
2013/12/18 职场文书
小学生元旦感言
2014/02/26 职场文书