React之元件巢狀
阿新 • • 發佈:2019-01-27
在React元件中,父元件向子元件通訊,是通過屬性的方法,而子元件向父元件通訊,則是使用間接委託的方式。
例如,在子元件中觸發一個方法,通過呼叫父元件中對應的函式,來與父元件進行通訊:
程式碼示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="react.js"></script>
<script src="react-dom.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.3/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.3/react-dom.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js" ></script>
</head>
<body>
<div id="demo"></div>
<script type="text/babel">
var GenderSelect=React.createClass({
render:function(){
return <select onChange={this.props.handleSelect}>
<option value="0" >男</option>
<option value="1">女</option>
</select>
}
});
var SignupForm=React.createClass({
getInitialState:function(){
return{
name:'',
password:'',
gender:'',
}
},
handleChange:function(key,event){
var newState={};
newState[key]=event.target.value;
console.log("newState:"+JSON.stringify(newState));
this.setState(newState);
},
handleSelect:function(event){
this.setState({gender:event.target.value})
},
render:function(){
console.log(this.state)
return <form>
<input type="text" placeholder="Name" onChange={this.handleChange.bind(this,'name')} />
<input type="password" placeholder="password" onChange={this.handleChange.bind(this,'password')} />
<GenderSelect handleSelect={this.handleSelect} />
</form>
}
});
ReactDOM.render(<SignupForm></SignupForm>,document.getElementById('demo'))
</script>
</body>
</html>
在這段程式碼中, SignupForm
是父元件,GenderSelect
是子元件。
注意這兩行:
<input type="text" placeholder="Name" onChange={this.handleChange.bind(this,'name')} />
<input type="password" placeholder="password" onChange={this.handleChange.bind(this,'password')} />
這裡,onChange
進行了 bind()
繫結。
1.
bind()
的第一個引數this
,代表當前的this指向的元件,這樣在父元件中使用handleChange()的時候,就可以保證指明this.
如果改成<input type="text" placeholder="Name" onChange={this.handleChange.bind(this.state,'name')} />
,則在父元件的handleChange()
函式中,this就指向this.state
2.
bind()
第二個引數,將會傳入到父元件中。handleChange()
的第二個引數key
上,因為這裡存在兩個input,所以必須通過key告訴父元件,該改變的是哪一個input標籤的狀態,因為資料是通過父元件傳送給伺服器的,所以子元件若是改變狀態,則必須告訴父元件,通過父元件傳達給伺服器。