您如何确保方法在React组件类中具有正确的上下文?

在JavaScript类中,默认情况下不绑定方法。这意味着它们的 this 上下文可以更改(对于事件处理程序,可以更改为正在侦听事件的元素),并且不会引用组件实例。为了解决这个问题, 可以使用强制  上下文作为组件实例。Function.prototype.bind()this

constructor(props) {
  super(props);
 this.handleClick= this.handleClick.bind(this);
}

handleClick() {
  // 执行一些逻辑
}

  • 该 bind 方法可能很冗长,并且需要定义一个 constructor,因此通常首选新的公共类字段语法:

handleClick = () => {
  console.log('this is:', this);
}

render() {
  return (
    <button onClick={this.handleClick}>
      Click me
    </button>
  );
}

  • 您还可以使用嵌入式箭头函数,因为this 保留了词法 (指组件实例):

<button onClick={e => this.handleClick(e)}>Click me</button>

请注意,使用此技术可能会产生额外的重新渲染,因为在渲染上会创建一个新的函数引用,该函数引用会传递给子组件并进行中断 shouldComponentUpdate / PureComponent 浅层相等性检查,以防止不必要的重新渲染。在性能很重要的情况下,最好 bind 在构造函数或公共类字段语法方法中使用,因为函数引用保持不变。

额外信息

  • 您可以将方法绑定到构造函数中的组件实例上下文,可以使用公共类字段语法,也可以使用嵌入式箭头函数。

其他连结
  • 对处理事件做出反应

  • 对将函数传递给组件的React文档