当前位置: 首页 > 面试题库 >

为什么在使用ES6和ReactJS时必须使用bind?

公冶谦
2023-03-14
问题内容

结合使用带有ReactJS的ES5开发,可以将组件描述如下:

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概念。

以下文章对此进行了很好的解释。

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

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

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

另外,顺便提一下,您应该在构造函数中而不是在render方法中进行所有事件绑定。这将防止多次绑定调用。

这是有关该主题的另一条很好的信息。他们说:

我们建议您将事件处理程序绑定到构造函数中,这样对于每个实例它们都只绑定一次

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



 类似资料:
  • 问题内容: 即使等待1的linux手册页很好地说明了您需要让子进程不使其变成僵尸,但它根本无法说明原因。 我围绕一个Ever 循环计划了我的程序(这是我的第一个多线程程序,所以请原谅我的天真),该循环启动子进程,该子进程被ed淘汰,并确保自行终止。 我无法使用,因为这使并行计算变得不可能,因此我可能不得不添加一个存储子pid的进程表,并且不得不使用-不是立即执行,而是经过一段时间- 这是一个问题,

  • 关于在最新版本的GCC和Clang中编译有几个问题:实验::filessystems链接器错误 但是现在< code>filesystem已经被c 17接受,所以不再需要< code>experimental或< code>-lstdc fs标志,对吗? 错了,我甚至不能 只给了我< code >实验版本,我怎么能包括正式接受的版本呢?

  • 问题内容: 我意识到我编写的所有组件都不使用。 我倾向于按照官方文档在https://facebook.github.io/react/docs/multiple- components.html 顶部声明的方式来编写组件。 正在像这样嵌套组件… …对像这样组成它们有益吗?: A.js 假设这是正确的术语,我想念的是什么? 问题答案: 在我的应用程序中,我很少使用this.props.childr

  • 问题内容: 每个人都告诉我“使用super.viewDidLoad()因为它就是这样”或“我一直那样做,所以要保留它”,“如果不叫super就是错误的”等。 我只发现了一些有关Objective-C用例的主题,这些主题并没有那么启发性,但是我正在Swift 3中进行开发,所以有什么专家可以给我一个很好的详细解释吗? 这是一种良好实践的案例还是有任何隐藏的影响? 问题答案: 通常,最好为您覆盖的所有

  • 本文向大家介绍为什么必须使用Twitter进行联网,包括了为什么必须使用Twitter进行联网的使用技巧和注意事项,需要的朋友参考一下 如果我们能够在线开发有价值的业务网络,那真是太棒了? 是的,通过“ Twitter”可以实现–实时通信枢纽成为一个出色的业务网络平台。通过在这种快节奏的环境中改进和实施我们的社交网络技能,Twitter可以用作构建强大的业务网络的起点。 对于Twitter的网络,

  • 问题内容: 我是ReactJS的新手,并安装了node.js和babel。我不清楚为什么我们在react中使用node.js和babel。 问题答案: 有多种方法可以开始使用React.js库。虽然,最方便的方法是使用Babel + Webpack。 React使用JSX语法。Babel是一个编译器,即它将JSX转换为原始JavaScript。您可以将babel视为代码和“可执行”代码之间的中间步