React的双向绑定
以前对于双向绑定概念来自于Angular.js,现在我用我感兴趣的react.js来实现这样的方式。有2种方式分析,1:不用插件,2:用插件
(引入react.js操作省略。。。)
不用插件:
先创建react组件
var NoLink = React.createClass({}); React.render(<NoLink />,document.body);
组件创建好了,需要一个初始化变量,来公用显示输入的数据
var NoLink = React.createClass({
getInitialState:function(){
return {message:''}
}
}); React.render(<NoLink />,document.body);
message初始值为空,这是正常项目环境可以这样设置。下面我想用一个input输入框 和一个b标签实现双向绑定的效果,render所需要的html标签
var NoLink = React.createClass({
getInitialState:function(){
return {message:''}
},
render:function(){
var mess = this.state.message;
return (
<div>
<input type="text" onChange={this.handelChange} value={mess} />
<b>{mess}</b>
</div>
)
}
});
React.render(<NoLink />,document.body);
在上面代码中 可以清晰的 看出返回的组件元素,其中在input输入框中加了一个onChange操作,这个处理当我们输入内容的时候,怎么让输入的内容同时展示在b标签中;在react操作中其实很简单。
var NoLink = React.createClass({
getInitialState:function(){
return {message:''}
},
handelChange:function(event){
console.log(event.target);
this.setState({message:event.target.value})
},
render:function(){
var mess = this.state.message;
return (
<div>
<input type="text" onChange={this.handelChange} value={mess} />
<b>{mess}</b>
</div>
)
}
}); React.render(<NoLink />,document.body);
onChange直接调用handelChange函数,在这只要处理对初始化变量message的重新赋值就可以了,在react中获取初始值 直接用“this.state.初始值",如果想设置初始值直接用"this.setState({初始值:新值})",这个点先理清楚了我需要设置初始值,然后呢
我的输入值怎么直接管理到setState中去,当我onChange={this.handelChange}时候就开始应用handelChange函数了在这里通过event.target可以直接获取当前dom元素对象,因为我在这里用input,获取其值的方式".value"就可以了。
我在render的时候定义了mess变量来存放初始化message的值,这个js写法,懂得js性能的人一看就明白了,不多说。看下在浏览器的操作:
接下来换种方式:用插件形式
用插件:
react.js给我们提供了linkState函数,但这个函数来自于React.addons.LinkedStateMixin,首先看下源码的操作,先进入React.addons.js中去找LinkedStateMixin
这里几个对象就是这个addons.js中提供的所有操作,有重要的react动画插件CSSTransitionGroup包含其中。接下来我们这次需要linkedStateMixin所以走到这个对象中去看看:
在这里只提供了linkState函数,直接返回一个ReactLink对象,把参数直接给ReactLink对象去做处理。
主要这个东西怎么用在实例中,先创建一个react组件
var ReactLink = React.createClass({}); React.render(<ReactLink />,document.body);
接下来思考,在这个组件中我们怎么引入外面对象,react.js提供了一个mixins的函数,要是引用对象多了直接以数组形式展现;其源码如图
在组件中直接这样使用即可:
var ReactLink = React.createClass({
//引用公共插件linkedStateMixin
mixins:[React.addons.LinkedStateMixin]
}); React.render(<ReactLink />,document.body);
linkedStateMixin是拿到了,现在我们要做的是怎么在定义的vdom上使用,在源码中我看到this.props.valueLink 这样的形式,说明在虚拟dom元素中加入valueLink才能使用,
var ReactLink = React.createClass({
//引用公共插件linkedStateMixin
mixins:[React.addons.LinkedStateMixin],
getInitialState:function(){
return {message:''}
},
render:function(){
return (
<div>
<input type="text" valueLink = {this.linkState('message')}/>
<b>{this.state.message}</b>
</div>
)
}
}); React.render(<ReactLink />,document.body);
上面的写法也是最简洁的写法,直接将初始化变量message传给linkState函数中去,然后react插件源码先获取的虚拟dom中的valueLink属性再进行操作。
用这样形式写好了 试一下效果:
完全OK.
React的双向绑定的更多相关文章
- react实现双向绑定
双向绑定功能是在项目中比较常见的一个需求,传统的js实现方式是添加监听函数的方式,Vue框架实现很简单,因为它本身就是基于双向绑定实现的,接下来我将讲解一下如何使用react实现双向绑定的功能是 首先 ...
- vue中的双向绑定
概述 今天对双向绑定感兴趣了,于是去查了下相关文章,发现有用脏检查的(angular.js),有用发布者-订阅者模式的(JQuery),也有用Object.defineProperty的(vue),其 ...
- React入门---事件与数据的双向绑定-9
上一节中,我们是从父组件给子组件传送数据,要实现事件与数据的双向绑定,我们来看如何从子组件向父组件传送数据; 接触之前,我们看一些里面函数绑定的知识: 例:通过点击事件改变state的age属性值: ...
- React中的“双向绑定”
概述 React并不是一个MVVM框架,其实它连一个框架都算不上,它只是一个库,但是react生态系统中的flux却是一个MVVM框架,所以我研究了一下flux官方实现中的"双向绑定&quo ...
- react 实现数据双向绑定
好久没有更新了 只是都写在有道笔记中 今天整理下 一些基础的 大神勿喷 一个基础的不能再基础的数据双向绑定 因为react不同于vue 没有v-model指令 所以怎么实现呢? import Reac ...
- React之this.refs, 实现数据双向绑定
1.实现数据双向绑定 将input组件与this.state属性绑定,要么是readonly, 要么使用onChange事件: 获取input元素的value值,有两种方式: 1) e.target. ...
- react第十一单元(受控组件和非受控组件-实现类似于vue双向绑定的功能)
第十一单元(受控组件和非受控组件-实现类似于vue双向绑定的功能) #课程目标 理解因为react的单向数据流 理解表单组件会因为react数据流变的不好维护 理解受控组件与非受控组件的实质区别 理解 ...
- Backbone.Events—纯净MVC框架的双向绑定基石
Backbone.Events-纯净MVC框架的双向绑定基石 为什么Backbone是纯净MVC? 在这个大前端时代,各路MV*框架如雨后春笋搬涌现出来,在infoQ上有一篇 12种JavaScrip ...
- Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定
一放假就高产似母猪了. 00.混乱的前端界 Angular1.x确实是个学习成本很高的框架,刚开始实习那会儿,前端啥也不懂,工头说用Angular,我们这群小弟也只能硬着头皮学.在这之前,前端的东西大 ...
随机推荐
- Protocol Framework - SNMP Tutorial
30.4 Protocol Framework TCP/IP network management protocols2 divide the management problem into two ...
- Windows10环境配置nat123端口映射访问mysql
背景:因工作需要,在宽带路由器内部设置一个台式机(可上网),配置成数据库服务器.分散各处的多台外网机可以通过jdbc连接该数据库服务器进行开发.要进行端口映射. 环境: 宽带通 Windows10企业 ...
- elasticsearch snapshot
一.Repositories 在elasticsearch.yml文件中增加path.repo路径配置: $ vim /etc/elasticsearch/elasticsearch.yml path ...
- Python学习笔记——列表
1.创建列表类型数据并给其赋值 >>> aList = [123,'abc',4.56,['inner','list'],7-9j] >>> aList [123, ...
- Zabbix3 agent端安装(二)
1.基础环境准备 安装zabbix的yum源,这里有必要提一点,阿里的yum源已经提供了zabbix3.0 1.1.yum源配置 rpm -ihv http://mirrors.aliyun.com/ ...
- ajax方法简单实现
//option {url,medthod,type,data,fSuccess,fError} function ajax(option) { var xhr = window.XMLHttpRqu ...
- C#深入浅出 继承(六)
这个标题写出来好长时间了,都没写内容,今天无论如何都得写完它,昨天写了一段,尼玛,电脑突然死机,重启之后啥都没了. 继承嘛,有人觉得很简单,但是里面还是有内容可以讲的,因为面向对象也就这么点内容,封装 ...
- 解决table不能换行的问题与CSS之自动换行总结
table不能换行问题 一般是:一行里面全是数字或是字母或者结尾有多个感叹号而导致 table不能换行,中文默认的会自动换行的,字母不能换行问题:style="table-layout:fi ...
- Ubuntu 14.04 LTS 安装Docker
Docker官方是有很详细的安装文档(https://docs.docker.com/engine/installation/ubuntulinux/),这里做了一个Ubuntu 14.04 LTS中 ...
- iOS抓包利器Charles
iOS抓包利器Charles http://wonderffee.github.io/blog/2013/07/13/best-packet-capture-tool-charles-in-ios/ ...