這個背景

使用 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;