当前位置: 首页 > 知识库问答 >
问题:

为什么我们需要在ReactJS中使用bind()来访问this.props或this.state?[副本]

安明亮
2023-03-14

以这段代码为例

   import React, { Component } from ‘react’;
    class App extends Component {
      constructor(props) {
        super(props);
        this.clickFunction = this.clickFunction.bind(this);
      }
      clickFunction() {
        console.log(this.props.value);
      }
      render() {
        return(
          <div onClick={this.clickFunction}>Click Me!</div>
        );
      }
    }

绑定(这个)的目的是什么?它将函数clickFunction绑定到clickFunction已经绑定到的对象的上下文,让我用一个普通的javascript代码来说明我想说的话:

class my_class {
  constructor() {
    this.run = this.run.bind(this)
  }
  run() {
    console.log(this.data)
  }
}
my_class.data = 'this is data'
new my_class().run() //outputs 'undefined'

如果你移除绑定(这个),它会给你同样的结果

  constructor() {
    this.run = this.run
  }

结果:

new my_class().run() //still outputs 'undefined'

我肯定我理解错了,这可能是地球上最糟糕的问题,但是我对es6还不熟悉,我还不习惯上课,所以我为此道歉

共有1个答案

秦经义
2023-03-14

责怪别人,不要做出反应。这样做是为了在传递函数时保留对象实例。当然,它必须在语义上正确,函数才能期望这样的对象。最常见的情况是在传递对象方法时绑定它。关键字This取决于函数的调用方式,而不是函数的创建方式/位置。调用时应保持与此的关系。

考虑:

class Welcome extends React.Component {
    render() {
      return <button onClick={this.sayName}>Say My 
           Name</button>;                        
    }

    sayName() {
      alert(this.props.name);
    }
}

在React中,您可以这样调用:。这将呈现一个按钮。单击按钮应触发带有“鲍勃”的警报。

除非它没有。因为在上面的例子中,这在sayName函数中是未定义的。

render函数中发生的事情是,它引用了React组件的当前实例。该组件定义了一个sayName函数,所以这个.sayName指向我们的函数,非常好。

但是React在幕后所做的是将this.say名称分配给另一个变量。那就是,就像这样:

let onClick = this.sayName;
onClick(); // Technically a click event is passed 
to onClick

//但对于我们的目的来说,这并不重要,我们得到了一个错误。因为这是未定义的。这是非常令人困惑的,因为在以前版本的React中,React将为您“自动绑定”事件处理程序,因此它可以工作。但在某个时候,Facebook决定停止这样做,所以。。。我们到了。

那么我们如何修复我们的组件呢?我们只是把自己绑起来,像这样:

<button onClick={this.sayName.bind(this)}>Say My 
Name</button>;

或使用ES6语法:

<button onClick={() => this.sayName()}>Say My 
Name</button>;

它应该工作!

 类似资料:
  • 问题内容: 我开始使用RxJS,但我不明白为什么在此示例中我们需要使用类似or 的函数;数组的数组在哪里? 如果有人可以直观地解释正在发生的事情,那将非常有帮助。 问题答案: 当您有一个Observable的结果是更多Observable时,可以使用flatMap。 如果您有一个由另一个可观察对象产生的可观察对象,则您不能直接过滤,缩小或映射它,因为您有一个可观察对象而不是数据。如果您生成一个可观

  • 问题内容: 基数实际上是什么意思?我们为什么需要它? 问题答案: 您可能并不总是希望将整数解析为以10为底的数字,因此提供基数可以指定其他数字系统。 基数是一位数字的值数。十六进制为16。八进制为8,二进制为2,依此类推… 在该函数中,您可以执行一些操作来提示基数而不提供基数。如果用户输入的字符串与其中一个规则匹配,但没有明确规定,则这些方法也可能对您不利。例如:

  • 问题内容: 好的,假设我们有两个表,和。在评论中,我们有一列,它表示哪个用户键入了该特定评论。为什么我们需要将其指定为外键?如果我们不这样做,它将仍然有效。我们指定主键,因为据我所知,它可以使查询速度更快(我们只需要搜索一行,而当我们没有主键/索引时,则必须遍历所有行)。这只是一种良好的编码习惯吗? 问题答案: 使用外键时,您将获得: 数据的完整性 更快的查询。 用户: 用户ID: 1个 2个 3

  • 问题内容: 我将稍微解释一下我的脚本,以便您可以理解我的问题。 基本上我做了一个脚本来检查SOCKS5是还是。 当我在上面测试我的脚本时,它运行良好,但是当我在Windows上对其进行测试时,直到我将以下行添加到: 谁能向我解释为什么我在Windows中需要此行,而在Linux服务器上却不需要? 问题答案: SSL证书上的此cURL手册页介绍了连接到SSL / TLS受保护主机时 证书验证 的过程

  • 问题内容: 示例1中的问题是“ this”引用了全局名称而不是myName对象。 我了解在将this的值设置为特定对象时使用bind()的方法,因此它可以解决示例1中的问题,但是为什么首先会出现此问题?这仅仅是创建Javascript的方式吗? 我还想知道为什么示例3解决了这个问题,以及示例2和示例3之间的区别。 问题答案: 为什么需要JavaScript bind()? 值是决定 如何 一个功能

  • 我正在修改我以前使用的Visitor模式。我们有基类Element,它有虚拟方法接受(Visitor),并且这个方法在继承自Element的所有类中都被重写。在任何派生类中,接受()所做的就是调用visitor- 为什么客户不能直接打电话给访客- 调用元素中有哪些有用的信息。接受(访客),然后依次呼叫访客。参观(元素)?这使得Visitor模式的使用很麻烦,并且在所有元素类的层次结构中都需要额外的