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 相关文章推荐
JAVASCRIPT HashTable
Jan 22 Javascript
javascript下有关dom以及xml节点访问兼容问题
Nov 26 Javascript
JS编程小常识很有用
Nov 26 Javascript
js倒计时抢购实例
Dec 20 Javascript
AngularJS中如何使用echart插件示例详解
Oct 26 Javascript
利用Vue.js实现求职在线之职位查询功能
Jul 03 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
Oct 25 Javascript
vue+element-ui+ajax实现一个表格的实例
Mar 09 Javascript
详解Vue.js项目API、Router配置拆分实践
Mar 16 Javascript
微信小程序中遇到的iOS兼容性问题小结
Nov 14 Javascript
深入理解react 组件类型及使用场景
Mar 07 Javascript
详解CocosCreator消息分发机制
Apr 16 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
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
2010/05/17 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
jQuery 插件封装的方法
2016/11/16 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
2017/01/04 Javascript
JavaScript自定义分页样式
2017/01/17 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
vuex实现的简单购物车功能示例
2019/02/13 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
微信小程序实现页面浮动导航
2020/01/08 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
Python内置函数dir详解
2015/04/14 Python
python 执行shell命令并将结果保存的实例
2018/05/11 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
2018/06/13 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
澳大利亚著名的纺织品品牌:Canningvale
2020/05/05 全球购物
方正Java笔试题
2014/07/03 面试题
年终自我鉴定
2013/10/09 职场文书
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
2014年药店工作总结
2014/11/20 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android