为啥我们需要在 ReactJS 中使用 bind() 来访问 this.props 或 this.state? [复制]

Posted

技术标签:

【中文标题】为啥我们需要在 ReactJS 中使用 bind() 来访问 this.props 或 this.state? [复制]【英文标题】:Why do we need to use bind() in ReactJS to access this.props or this.state? [duplicate]为什么我们需要在 ReactJS 中使用 bind() 来访问 this.props 或 this.state? [复制] 【发布时间】:2019-11-11 06:20:52 【问题描述】:

以这段代码为例

   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>
        );
      
    

bind(this) 的目的是什么?它将函数 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'

如果你删除了 bind(this) 它会给你同样的结果

  constructor() 
    this.run = this.run
  

结果:

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

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

【问题讨论】:

你应该在提问之前做一些研究。这是一个有据可查的事情。 React 类不会在自定义函数上绑定 this 上下文。所以你必须自己绑定它。这是一个更普通的 JS 东西,而不是特定的反应。 【参考方案1】:

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

考虑:

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

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

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

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

render 函数内部发生的事情是 this 引用了我们的 React 组件的当前实例。该组件定义了一个 sayName 函数,所以 this.sayName 指向我们的函数,很好,花花公子。

但是 React 在幕后所做的是将 this.sayName 分配给另一个变量。也就是说,就是这样:

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>;

它应该可以工作!

【讨论】:

最好在构造函数中绑定或使用箭头函数“自动绑定”this。您的实现将为每个渲染创建一个新函数。 终于有人懂我了,非常感谢。

以上是关于为啥我们需要在 ReactJS 中使用 bind() 来访问 this.props 或 this.state? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们在调用 bind() 时将 sockaddr_in 转换为 sockaddr?

为啥在 TCP 中使用 bind()?为啥它只用在服务器端而不用在客户端?

ReactJs:为啥 ref.current 在渲染组件时返回 null?

为啥我的 ReactJS 应用程序在本地运行但不在 Azure 中运行?

为啥拖放 ReactJS 时光标图标没有改变?

ReactJS:如何将 knockoutJS 页面包装在 React 组件中