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 写的简单进度条控件
Jan 22 Javascript
Javascript 读书笔记索引贴
Jan 11 Javascript
jQuery解决input超多的表单提交
Aug 10 Javascript
jQuery实现图片渐入渐出切换展示效果
Aug 15 Javascript
jQuery焦点图轮播特效代码分享(3款)
Sep 05 Javascript
JQuery在循环中绑定事件的问题详解
Jun 02 Javascript
14 个折磨人的 JavaScript 面试题
Aug 08 Javascript
微信小程序开发技巧汇总
Jul 15 Javascript
Paypal支付不完全指北
Jun 04 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
Sep 04 Javascript
JS实现可以用键盘方向键控制的动画
Dec 11 Javascript
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
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 AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
php页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
PHP数组实例详解
2016/06/26 PHP
使用WAMP搭建PHP本地开发环境
2017/05/10 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
2013/09/11 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
javascript 实现动态侧边栏实例详解
2016/11/11 Javascript
jQuery Masonry瀑布流插件使用方法详解
2017/01/18 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
通过构造函数实例化对象的方法
2017/06/28 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
vue实现员工信息录入功能
2020/06/11 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
python实现类之间的方法互相调用
2018/04/29 Python
python实现一组典型数据格式转换
2018/12/15 Python
对python 通过ssh访问数据库的实例详解
2019/02/19 Python
Python实现计算长方形面积(带参数函数demo)
2020/01/18 Python
Python中bisect的用法及示例详解
2020/07/20 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
python dict如何定义
2020/09/02 Python
什么时候用assert
2015/05/08 面试题
Structs界面控制层技术
2013/10/11 面试题
上课玩手机的检讨书
2014/10/01 职场文书
干货分享:推荐信写作技巧!
2019/06/21 职场文书
go设置多个GOPATH的方式
2021/05/05 Golang
Python合并pdf文件的工具
2021/07/01 Python
Python人工智能之混合高斯模型运动目标检测详解分析
2021/11/07 Python