React 将 this 绑定到类方法

IT技术 javascript reactjs
2021-04-07 14:23:23

所以我正在读一本关于 React 的书,里面说我必须像这样绑定我的方法

this.onClickMe = this.onClickMe.bind(this);

但它看起来工作得很好,不使用上面的代码

class ExplainBindingsComponent extends Component {
  onClickMe() {
    console.log(this);
  }
  render() {
    return (
      <button
        onClick={ () => { this.onClickMe() } }
        type="button"
      >
        Click Me
  </button>
    );
  }
}

但它说我应该做这样的事情,

class ExplainBindingsComponent extends Component {
  constructor() {
    super();
    this.onClickMe = this.onClickMe.bind(this);
  }
  onClickMe() {
    console.log(this);
  }
  render() {
    return (
      <button
        onClick={this.onClickMe}
        type="button"
      >
        Click Me
  </button>
    );
  }
}

this.onClickMe = this.onClickMe.bind(this);仍然是我必须做的?如果是这样,它与我上面的示例相比有何作用

3个回答

有多种方法可以将您的函数绑定到 React 类的词法上下文,

  • 一种这样的方法是在构造函数中绑定它,

  • 另一种方法是使用类字段作为箭头函数,并且

  • 使用 .bind 或箭头在渲染中绑定的第三种方法,

每个都可以使用,但是最好避免在渲染中绑定,因为每次渲染都会返回一个新函数

使用类字段作为箭头函数。

class ExplainBindingsComponent extends Component {
  onClickMe = () => {
    console.log(this);
  }
  render() {
    return (
      <button
        onClick={ this.onClickMe }
        type="button"
      >
        Click Me
  </button>
    );
  }
}

在渲染中绑定

onClick={() => this.onClickMe() }

或者

onClick={this.onClick.bind(this)}
我认为如果您使用箭头函数,那么每个实例都会获得该方法的自己的副本,而不是所有实例共享该方法的一个副本。如果你喜欢那种东西,它肯定会与继承相混淆。
2021-06-17 14:23:23

this.onClickMe = this.onClickMe.bind(this);仍然是我必须做的?

你不,如果你使用箭头功能,捕捉词汇做到这一点this但它被认为是最佳实践,因为它允许您避免在内部创建函数render

render() {
    return (
      <button
        /* creates new function on every render call*/
        onClick={ () => { this.onClickMe() } }
        type="button"
      >
        Click Me
  </button>
    );
  }

对比

constructor() {
    super();

    // creates function once per component instance
    this.onClickMe = this.onClickMe.bind(this);
  }

在您的情况下,您不需要,因为您使用箭头函数 wherethis绑定到定义箭头函数的上下文 - 在这种情况下是您的组件。

this.onClickMe = this.onClickMe.bind(this)

当您在没有任何绑定的情况下传递函数时,这是必要的,因此它可能会在this指向另一个对象的地方被调用