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 02 Javascript
Javascript的一种模块模式
Sep 08 Javascript
JavaScript/jQuery 表单美化插件小结
Feb 14 Javascript
javascript标签在页面中的位置探讨
Apr 11 Javascript
js判断手机和pc端选择不同执行事件的方法
Jan 30 Javascript
jQuery实现contains方法不区分大小写的方法
Feb 13 Javascript
Javascript代码实现仿实例化类
Apr 03 Javascript
jquery衣服颜色选取插件效果代码分享
Aug 28 Javascript
jQuery图片轮播插件——前端开发必看
May 31 Javascript
VueJS如何引入css或者less文件的一些坑
Apr 25 Javascript
node.js将MongoDB数据同步到MySQL的步骤
Dec 10 Javascript
微信小程序实现弹幕墙(祝福墙)
Nov 18 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正则匹配中英文、数字及下划线的方法【用户名验证】
2017/08/01 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
js TextArea的选中区域处理
2010/12/28 Javascript
js 函数的副作用分析
2011/08/23 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
JS 创建对象的模式实例小结
2020/04/28 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
python把数组中的数字每行打印3个并保存在文档中的方法
2018/07/17 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
Python算法中的时间复杂度问题
2019/11/19 Python
Tensorflow的常用矩阵生成方式
2020/01/04 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
解决django FileFIELD的编码问题
2020/03/30 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
详解python tkinter 图片插入问题
2020/09/03 Python
电气个人求职信范文
2014/02/04 职场文书
活动总结报告格式
2014/05/09 职场文书
意向书范本
2014/07/29 职场文书
教师职位说明书
2014/07/29 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
励志正能量20句:送给所有为梦想拼搏的人
2019/11/11 职场文书
Python学习之异常中的finally使用详解
2022/03/16 Python