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 相关文章推荐
jquery插件开发方法(初学者)
Feb 03 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
Nov 23 Javascript
javascript中SetInterval与setTimeout的定时器用法
Aug 24 Javascript
JS实现灵巧的下拉导航效果代码
Aug 25 Javascript
简单掌握JavaScript中const声明常量与变量的用法
May 21 Javascript
JavaScript简单下拉菜单特效
Sep 13 Javascript
JavaScript中boolean类型之三种情景实例代码
Nov 21 Javascript
前端面试知识点锦集(JavaScript篇)
Dec 28 Javascript
jQuery上传多张图片带进度条样式(DEMO)
Mar 02 Javascript
vue + socket.io实现一个简易聊天室示例代码
Mar 06 Javascript
Windows下Node爬虫神器Puppeteer安装记
Jan 09 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
Mar 28 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运行时强制显示出错信息的代码
2011/04/20 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
Jquery为单选框checkbox绑定单击click事件
2012/12/18 Javascript
Javascript异步编程模型Promise模式详细介绍
2014/05/08 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
Javascript基础知识(一)核心基础语法与事件模型
2014/09/29 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
jquery平滑滚动到顶部插件使用详解
2017/05/08 jQuery
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
解决vue+webpack打包路径的问题
2018/03/06 Javascript
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
用实例解释Python中的继承和多态的概念
2015/04/27 Python
深入讲解Python编程中的字符串
2015/10/14 Python
Python计算两个日期相差天数的方法示例
2017/05/23 Python
django form和field具体方法和属性说明
2020/07/09 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
柯基袜:Corgi Socks
2017/01/26 全球购物
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
应届大学生自荐信格式
2013/09/21 职场文书
行政文员岗位职责
2013/11/08 职场文书
六一儿童节活动总结
2014/08/27 职场文书
2014财务年终工作总结
2014/12/08 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
给numpy.array增加维度的超简单方法
2021/06/02 Python
python入门学习关于for else的特殊特性讲解
2021/11/20 Python
Apache Pulsar结合Hudi构建Lakehouse方案分析
2022/03/31 Servers