linkState
需求是这样的,我点击ABox,给他append BBox CBox,其中要BBox和CBox里面的input数据流双向绑定,但是我这样写input根本输入不了文字,一直是默认文字
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>超级表单</title>
<meta name="description" content="">
<meta name="keywords" content="">
<script src="react-with-addons.min.js"></script>
<script src="react-dom.min.js"></script>
<script src="browser.min.js"></script>
</head>
<style>
.addField {
border: 2px dashed #DDD;
text-align: center;
font-size: 30px;
cursor: pointer;
padding: 10px 0;
}
</style>
<body>
<div class="form" id="form">
</div>
<script type="text/babel">
var _ABox;
var ABox=React.createClass({
mixins: [ React.addons.LinkedStateMixin ],
getInitialState:function(){
_ABox=this;
return {BBox:[],CBox:[],text:'默认文字'}
},
appendHtml:function(b,c){
this.setState({
BBox:b,
CBox:c
})
},
render:function(){
return <div>
<div className="addField" onClick={this.appendHtml.bind(null,<BBoxItem/>,<CBoxItem/>)}> +添加新字段</div>
<BBox bItem={this.state.BBox}/>
<CBox cItem={this.state.CBox}/>
</div>
}
});
var BBox=React.createClass({
render:function(){
return <div className="BBox">{this.props.bItem}</div>
}
});
var BBoxItem=React.createClass({
render:function(){
return <li ><input type="text" valueLink={_ABox.linkState('text')}/></li>
}
});
var CBox=React.createClass({
render:function(){
return <div className="CBox">{this.props.cItem}</div>
}
});
var CBoxItem=React.createClass({
render:function(){
return <li><input type="text" valueLink={_ABox.linkState('text')}/></li>
}
});
ReactDOM.render(
<ABox />,
document.getElementById('form')
)
</script>
</body>
</html>
虽然没有用过linkState,但react中input如果指定了value,那用户输入的值是不会显示的,因为value已经被react控制了,如果要想用户能输入,必须添加一个onchange的handler,每次onchange的时候更新state或props,从而达到改变value的效果。
[UPDATE]
不知道理解的是否有偏差,总觉得这样的需求没必要双向绑定,只通过props就能够实现,请参考以下代码。
B和C基本是一样的,偷了个懒,记得多点几下add。。。