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} οnchange={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()来用方法修改值 。

它们的变化 会同步到父组件的。并更新标签的。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值