这个背景
使用 React.createClass 将自动正确绑定 this
上下文(值),但使用 ES6 类时则不然。
React.createClass
注意 this.handleClick
声明与 this.handleClick
方法绑定。当调用此方法时,React 会将正确的执行上下文应用于 handleClick
。
import React from 'react';
const MyComponent = React.createClass({
handleClick() {
console.log(this); // the React Component instance
},
render() {
return (
<div onClick={this.handleClick}></div>
);
}
});
export default MyComponent;
React.Component
对于 ES6 类,this
默认为 null
,该类的属性不会自动绑定到 React 类(组件)实例。
import React from 'react';
class MyComponent extends React.Component {
constructor(props) {
super(props);
}
handleClick() {
console.log(this); // null
}
render() {
return (
<div onClick={this.handleClick}></div>
);
}
}
export default MyComponent;
我们可以通过几种方式绑定正确的 this
上下文。
案例 1:绑定内联:
import React from 'react';
class MyComponent extends React.Component {
constructor(props) {
super(props);
}
handleClick() {
console.log(this); // the React Component instance
}
render() {
return (
<div onClick={this.handleClick.bind(this)}></div>
);
}
}
export default MyComponent;
情况 2:在类构造函数中绑定
另一种方法是改变 this.handleClick
内的 this.handleClick
的背景。这样我们就可以避免内联重复。被许多人认为是一种更好的方法,可以避免触及 JSX:
import React from 'react';
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.log(this); // the React Component instance
}
render() {
return (
<div onClick={this.handleClick}></div>
);
}
}
export default MyComponent;
案例 3:使用 ES6 匿名功能
你还可以使用 ES6 匿名函数,而无需显式绑定:
import React from 'react';
class MyComponent extends React.Component {
constructor(props) {
super(props);
}
handleClick = () => {
console.log(this); // the React Component instance
}
render() {
return (
<div onClick={this.handleClick}></div>
);
}
}
export default MyComponent;