React.createClass()

React 提供了 React.createClass 方法来创建组件,React 会自动绑定 this 到函数中去,所以不需要手动绑定

React.createClass({
getInitialState: function () {
return {
liked: false,
};
},
handleChange: function (e) {
this.setState({
liked: !this.state.liked,
});
},
render: function () {
return (
<div>
<h3>{this.state.liked ? 'like' : 'unlike'}</h3>
<button onClick={this.handleChange}>click</button>
</div>
);
},
});

bind(this)

目前流行用 class 来创建组件,babel 编译,所以 react 内部没有帮我们自动绑定 this 的指向,需要手动绑定

class Code extends React.Component {
state = {
liked: false // true
}
handleChange (e) {
this.setState({
liked: !this.state.liked
})
}
render() {
return (
<div>
<h3>{ this.state.liked ? 'like': 'unlike' }</h3>
<button onClick={ this.handleChange.bind(this) }>click</button>
</div>
)
}
}

上面的绑定 this 虽然是能够改变 this 的指向,但是会损耗性能,应为每次渲染组件的时候都调用了一次绑定操作,虽然性能没多大影响,但是尽量避免,最好的方法是在构造函数中执行绑定操作

class Code extends React.Component {
constructor(props) {
super(props);
// 在构造函数绑定this
this.handleChange = this.handleChange.bind(this);
}
state = {
liked: true,
};
handleChange(e) {
this.setState({
liked: !this.state.liked,
});
}
render() {
return (
<div>
<h3>{this.state.liked ? 'like' : 'unlike'}</h3>
<button onClick={this.handleChange}>click</button>
</div>
);
}
}

箭头函数

最后如果嫌弃每次都在构造函数绑定 this 麻烦的话,在定义相关函数的时候可以使用箭头函数来实现默认 this 指向

class Code extends React.Component {
state = {
liked: true,
};
handleChange = () => {
this.setState({
liked: !this.state.liked,
});
};
render() {
return (
<div>
<h3>{this.state.liked ? 'like' : 'unlike'}</h3>
<button onClick={this.handleChange}>click</button>
</div>
);
}
}

对比三种方法,其实最后一种方法是最好的,避免了每次都要在构造函数手动绑定 this 和性能的损耗,而且通俗易懂,少些代码,减少打包体积