React Element的事件綁定與DOM事件綁定很是類似,有兩個不一樣點須要注意:1) 事件名稱採用駝峯式命名。2) 在JSX中事件處理函數爲變量,須要使用大括號括起來解析。 3)不能經過return false阻止事件的默認行爲,必須經過調用preventDefault()app
class MyDiv extends React.Component{ constructor(props){ super(props); this.state = {status : true} // 若是要在回調函數中調用this,這行代碼不能省略 this.toggle = this.toggle.bind(this); } // 事件處理函數 toggle(){ this.setState(state=>({ status:!state.status })); } // 渲染 render(){ return ( <div onClick={this.toggle}> {this.state.status.toString()} , {this.state.status?'NO':'OFF'} </div> ) } } ReactDOM.render(<MyDiv/>,document.getElementById('app'));
函數中的THIS一直是比較糾結的問題。如上示例代碼中,若是在構造函數中省略下面這行代碼。那麼在事件處理函數中將沒法使用this。下面這行代碼表示將構造函數中的this也就是組件示例自己綁定到事件處理函數上。函數
this.toggle = this.toggle.bind(this);
固然除了使用這種方式以外,咱們還可使用ES6中的箭頭函數,由於箭頭函數中沒有自身的this,它的this指向它定義的內容也就是組件示例自己。因此第一個案例能夠修改成以下this
class MyDiv extends React.Component{ constructor(props){ super(props); this.state = {status : true} } // 事件處理函數爲箭頭函數 toggle = ()=>{ this.setState(state=>({ status:!state.status })); } // 渲染 render(){ return ( <div onClick={this.toggle}> {this.state.status.toString()} , {this.state.status?'NO':'OFF'} </div> ) } } ReactDOM.render(<MyDiv/>,document.getElementById('app'));
有兩種參數傳遞方式,一種是經過箭頭函數直接傳遞,箭頭函數中直接調用事件處理函數,實參爲要傳遞的參數與事件對象code
class MyDiv extends React.Component{ constructor(props){ super(props); this.state = {status : true} } // 事件處理函數 toggle = (id,e)=>{ this.setState(state=>({ status:!state.status })); } // 渲染 render(){ return ( <div onClick={(e)=>this.toggle(1,e)}> {this.state.status.toString()} , {this.state.status?'NO':'OFF'} </div> ) } }
另一種是經過調用bind函數,將this與要傳遞給函數值做爲實參進行傳遞對象
class MyDiv extends React.Component{ constructor(props){ super(props); this.state = {status : true} } // 事件處理函數 toggle = (id)=>{ this.setState(state=>({ status:!state.status })); } // 渲染 render(){ return ( <div onClick={this.toggle.bind(this,1)}> {this.state.status.toString()} , {this.state.status?'NO':'OFF'} </div> ) } }