1. 程式人生 > >React之元件巢狀

React之元件巢狀

  在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標籤的狀態,因為資料是通過父元件傳送給伺服器的,所以子元件若是改變狀態,則必須告訴父元件,通過父元件傳達給伺服器。