为什么需要在构造函数中绑定函数

IT技术 reactjs redux
2021-04-03 00:15:50

我有一个与此代码相关的问题:https : //github.com/reactjs/redux/blob/master/examples/async/containers/App.js

具体来说:

  constructor(props) {
    super(props)
    this.handleChange = this.handleChange.bind(this)
    this.handleRefreshClick = this.handleRefreshClick.bind(this)
  }

我想这是一个两部分的问题。

  1. 为什么我需要将句柄更改设置为 class 的实例,this.handleChange =我不能只对 handleChange 使用静态函数并直接在 class 中调用它 onClick={handleRefreshClick}>吗?
  2. 我不知道这里发生了什么: this.handleRefreshClick.bind(this)

谢谢

6个回答

以相反的顺序回答...

  1. this.handleRefreshClick.bind(something)返回一个新函数,其中对 的引用this将引用something这是保存 的当前值的一种方式,this在调用构造函数期间在作用域内,以便稍后在调用函数时使用。
  1. 如果您的函数不需要访问组件的状态,那么当然,您不需要绑定它们。

支持将这些行添加到构造函数的论点是,新的绑定函数仅在每个类实例中创建一次。你也可以使用

onClick={this.handleRefreshClick.bind(this)}

或(ES6):

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

但是每次重新渲染组件时,这两种方法中的任何一种都会创建一个新函数。

但是做 .bind(this) 一个类的整个想法是它封装了'this',所以当一个类的整个实例应该封装作用域时,为什么我需要将作用域封装在一个特定的函数中
2021-05-24 00:15:50
@abhinavm93 我是说除非你明确绑定this到一个函数,否则它的值取决于调用它的上下文。React 使用 render 函数创建带有事件处理程序的 DOM 元素。从处理这些事件的上下文来看,除非您绑定它,否则不知道这些事件处理程序所属的类。
2021-05-27 00:15:50
@Saad 不在 JS 中!类实际上只是花哨的函数他们没有做任何特别有用的事情this
2021-06-01 00:15:50
在 Render 中绑定或使用箭头函数是不好的,因为它会导致在每次渲染时重新分配函数。更好的方法是在构造函数中绑定或在类中使用箭头函数。medium.freecodecamp.org/…
2021-06-03 00:15:50
是的,这就是我的回答中所说的:)
2021-06-10 00:15:50

这样做的原因是将this关键字绑定到该对象。就像 Tom 所说的那样,从类中调用函数并不意味着它是使用创建该函数的对象的上下文来调用的。

我想你可能会感到困惑,因为在做出react的例子/教程,使用React.createClass()DOES绑定this自动为您。所以你可能想知道为什么 React.createClass() 这样做,但不使用 ES6 类语法。

这是因为 React 不想弄乱 ES6 规范this从其类绑定到函数不在 ES6 类规范中),但同时,希望为其用户提供 ES6 类语法的便利。您可以在下面阅读有关此内容的更多信息。

Github 问题

希望这能说明为什么会发生这种情况。

this 取决于函数的调用方式,而不是函数的创建方式/位置。

看代码的时候,看到两个“this”,为什么呢?看起来很奇怪,对吧? 问题是它不是关于它看起来如何。这是关于它是如何调用的。

你基本上是在说。嘿,当有人打电话给你时,你记得this是指这门课。不是别的。

当有人像这样称呼您的class时: x.yourClass().bind(this)您说的this是不是x而是class本身(带有props和状态等)。

快速注意,即使您像在浏览器yourClass()上实际调用一样直接调用类,这也是为什么在这种情况下this is window.window.yourClass()

这两个函数 handleChange 和 handleRefreshClick 作为props传递给其他组件,

它们绑定到 this 是因为当子组件将调用这些函数时,它们将始终与 APP 上下文一起执行。

您可以从类中删除这些函数,但仍然需要绑定它,因为您将更新 APP 的某些部分

我个人在构造函数中绑定函数,以便它们的引用不会在每次重新渲染时更改。

如果您将函数传递给只读子项,当他们的 props 没有改变时,您不需要更新这些函数,这一点尤其重要。我为此使用 react-addons-pure-render-mixin 。

否则,在每个父级重新渲染时,将发生绑定,将创建新的函数引用并将其传递给子级,这会认为 props 已更改。