【问题标题】:Why is it necessary to use bind when working with ES6 and ReactJS?为什么在使用 ES6 和 ReactJS 时必须使用绑定?
【发布时间】:2016-12-02 03:54:43
【问题描述】:

使用 ES5 开发 ReactJS,一个组件可以这样表述:

var MyComponent = React.createClass({
  alertSomething: function(event) {
    alert(event.target);
  },

  render: function() {
    return (
      <button onClick={this.alertSomething}>Click Me!</button>
    );
  }
});

ReactDOM.render(<MyComponent />);

在本例中,this 引用对象本身,这是预期的自然行为。

问题

我的问题是:

你如何使用 ES6 创建组件?

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
  }

  alertSomething(event) {
    alert(event.target);
  }

  render() {
    return (
      <button onClick={this.alertSomething.bind(this)}>Click Me!</button>
    );
  }
}

ReactDOM.render(<MyComponent />);

知道在 JavaScript 中 this 在使用 new 运算符时引用实例化对象本身,有人可以告诉我使用 bind 的真正目的是什么?是不是和 React 的内部机制有关?

【问题讨论】:

  • bind 只是核心 javascript。这就是事件绑定的工作方式。这不是一个 React 概念。
  • 这是预期的自然行为” - 不。这是React.createClass 的魔法——ES6 的行为是自然的。

标签: javascript reactjs bind


【解决方案1】:
var cat = {
  sound: 'Meow!',
  speak: function () { console.log(this.sound); }
};

cat.speak(); // Output: "Meow!"

var dog = {
  sound: 'Woof!'
};
dog.speak = cat.speak;

dog.speak(); // Output: "Woof!"

var speak = cat.speak;
speak(); // Output: "undefined"

speak = cat.speak.bind(dog);
speak(); // Output: "Woof!"

解释:

“this”的值取决于函数的调用方式。当您提供 this.alertSomething 作为按钮的 onClick 处理程序时,它会更改调用方式,因为您提供的是对该函数的直接引用,并且不会针对您的对象实例调用它(不确定我是否在表述对)。

.bind 函数将返回一个新函数,其中“this”被永久设置为传递给它的值。

ECMAScript 5 引入了 Function.prototype.bind。调用 f.bind(someObject) 会创建一个与 f 具有相同主体和范围的新函数,但是在原始函数中发生这种情况的地方,在新函数中,它永久绑定到 bind 的第一个参数,而不管函数如何正在使用。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

最好在组件的构造函数中执行此操作,这样 .bind 对每个处理程序只发生一次,而不是在每次渲染时发生。

【讨论】:

    【解决方案2】:

    bind 在 React ES6 类中的一个目的是你必须手动绑定。

    无自动绑定

    方法遵循与常规 ES6 类相同的语义,这意味着 >它们不会自动将 this 绑定到实例。你必须>明确地使用 .bind(this) 或箭头函数 =>:

    我们建议您在构造函数中绑定事件处理程序,以便它们>每个实例只绑定一次:

    constructor(props) {
      super(props);
      this.state = {count: props.initialCount};
      this.tick = this.tick.bind(this);  // manually binding in constructor
    }
    

    您可以从文档中了解更多信息:https://facebook.github.io/react/docs/reusable-components.html

    【讨论】:

      【解决方案3】:

      bind 只是核心 javascript。这就是绑定事件的工作方式。这不是 React 的概念。

      下面的文章解释得很好。

      JavaScript 中的有界函数是绑定到给定上下文的函数。这意味着无论您如何调用它,调用的上下文都将保持不变。

      要从常规函数中创建有界函数,请使用 bind 方法。 bind 方法将要绑定函数的上下文作为第一个参数。其余参数是始终传递给此类函数的参数。它返回一个有界函数作为结果。

      http://reactkungfu.com/2015/07/why-and-how-to-bind-methods-in-your-react-component-classes/

      另外,附带说明一下,您应该在构造函数中完成所有事件绑定,而不是在渲染方法中。这将防止多次绑定调用。

      这是关于这个主题的另一个很好的信息。他们说:

      我们建议您在构造函数中绑定事件处理程序,以便每个实例只绑定一次

      https://facebook.github.io/react/docs/reusable-components.html

      【讨论】:

      • 因为当您将类方法传递给组件或元素时,它们会绑定到这些组件/元素,因此将它们绑定到构造函数中的内部类作用域会将 this 的值绑定到内部类范围
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 2022-06-21
      相关资源
      最近更新 更多