import React, { Component } from 'react';
import { render } from 'react-dom';
class LikeButton extends Component {
constructor(props) {
super(props);
this.state = { liked: false };
}
handleClick(e) {
this.setState({ liked: !this.state.liked });
}
render() {
const text = this.state.liked ? 'like' : 'haven\'t liked';
return (
<p onClick={this.handleClick.bind(this)}> You {text} this. Click to toggle. </p>
);
}
}
render(
<LikeButton />, document.getElementById('example') ); 複製代碼
能夠看到 React 裏面綁定事件的方式和在 HTML 中綁定事件相似,使用駝峯式命名指定要綁定的 onClick 屬性爲組件定義的一個方法 {this.handleClick.bind(this)}。javascript
注意要顯式調用 bind(this) 將事件函數上下文綁定要組件實例上,這也是 React 推崇的原則:沒有黑科技,儘可能使用顯式的容易理解的 JavaScript 代碼。html
React 實現了一個「合成事件」層(synthetic event system),這個事件模型保證了和 W3C 標準保持一致,因此不用擔憂有什麼詭異的用法,而且這個事件層消除了 IE 與 W3C 標準實現之間的兼容問題。java
「合成事件」還提供了額外的好處:react
「合成事件」會以事件委託(event delegation)的方式綁定到組件最上層,而且在組件卸載(unmount)的時候自動銷燬綁定的事件。瀏覽器
好比你在 componentDidMount 方法裏面經過 addEventListener 綁定的事件就是瀏覽器原生事件。babel
使用原生事件的時候注意在 componentWillUnmount 解除綁定 removeEventListener。dom
Warning: 若是不在組件銷燬的時候解除事件的話,會形成內存泄露的問題。 函數
怎麼解決這個問題?這裏能夠看個人相關文章 react 內存泄露常見問題解決方案post
全部經過 JSX 這種方式綁定的事件都是綁定到「合成事件」,除非你有特別的理由,建議老是用 React 的方式處理事件。性能
class Button extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick(){
console.log('this is:', this);
}
render() {
return (
<button onClick={this.handleClick}> Click me </button>
);
}
}
複製代碼
class Button extends React.Component {
handleClick(){
console.log('this is:', this);
}
render() {
return (
<button onClick={this.handleClick.bind(this)}> Click me </button>
);
}
}
複製代碼
class Button extends React.Component {
handleClick(){
console.log('this is:', this);
}
render() {
return (
<button onClick={()=>this.handleClick()}> Click me </button>
);
}
}
複製代碼
class Button extends React.Component {
handleClick=()=>{
console.log('this is:', this);
}
render() {
return (
<button onClick={this.handleClick}> Click me </button>
);
}
}
複製代碼
render: function() {
return <p onClick={this.handleClick.bind(this, 'extra param')}>; }, handleClick: function(param, event) { // handle click } 複製代碼
方式1
是官方推薦的綁定方式,也是性能最好的方式。方式2和方式3
會有性能影響而且當方法做爲屬性傳遞給子組件的時候會引發重渲問題。方式4
是性能比較好的,如今 babel 已經很成熟了,推薦你們使用