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

为什么以及什么时候需要绑定React中的函数和eventHandlers?

羊舌兴德
2023-03-14
class SomeClass extends Component{
  someEventHandler(event){
  }
  render(){
    return <input onChange={------here------}>
  }
}

我看到不同版本的-------在这里------部分。

// 1
return <input onChange={this.someEventHandler.bind(this)}>

// 2
return <input onChange={(event) => { this.someEventHandler(event) }>

// 3
return <input onChange={this.someEventHandler}>

共有1个答案

孟乐逸
2023-03-14

绑定并不是特定的反应,而是this在JavaScript中的工作方式。每个函数/块都有自己的上下文,因为函数更具体地取决于它如何调用。React团队决定在添加ES6支持(类语法)时,不将this绑定到类的自定义方法(也不是内置方法,如componentdidmount)上。

绑定上下文的时间取决于函数的用途,如果需要访问类上的props、state或其他成员,则需要绑定它。

对于您的示例,每一个都是不同的,这取决于您的组件是如何设置的。

a.在构造函数中进行绑定。又名

class SomeClass extends Component{
    constructor(){
        super();
        this.someEventHandler = this.someEventHandler.bind(this);
    }
    someEventHandler(event){
    }
    ....
} 

b.在类fat arrow functions上创建自定义函数。又名

class SomeClass extends Component{
    someEventHandler = (event) => {
    }
    ....
}

有几种常见的方法可以做到这一点

onChange={ (event) => this.someEventHandler(event) }
onChange={ this.someEventHandler.bind(this) }

带有其他参数

如果您希望避免创建新的函数引用,但仍然需要传递参数,最好将其抽象到子组件中。你可以在这里读到更多关于它的内容

// 1
return <input onChange={this.someEventHandler.bind(this)}>

这只是将运行时事件处理程序绑定到您的类。

// 2
return <input onChange={(event) => this.someEventHandler(event) }>
// 3
return <input onChange={this.someEventHandler}>

您只是将函数作为回调函数传递,以便在click事件发生时触发,而不需要附加参数。一定要预绑定!

总结一下。考虑如何优化您的代码是很好的,每个方法都有一个实用工具/目的取决于您需要什么。

 类似资料:
  • 问题内容: class SomeClass extends Component{ someEventHandler(event){ } render(){ return } } 我看到零件的不同版本。 版本有何不同?还是只是偏爱问题? 问题答案: 绑定不是特定于React的东西,而是在Javascript中的工作方式。每个函数/块都有其自己的上下文,对于函数而言,其功能更特定于其调用方式。当添加E

  • 问题内容: 我对JAX-WS进行了概述,并注意到了(和)的一些引用。 在什么情况下需要?(我认为JSR 109服务器?!) 问题答案: 是使用SUN的参考实现将Web服务作为标准存档部署在非Java EE5 Servlet容器上时所需的专有部署描述符。 Sun的RI 用作servlet上下文事件的侦听器和调度程序servlet。两者都必须在中声明。然后需要该文件为定义Web服务端点,以使其知道必须

  • 问题内容: 什么时候以及为什么要使用JavaScript? 问题答案: 通常,在事件处理程序(如中)中,返回false是一种告诉事件实际上未触发的方法。因此,在这种情况下,这意味着将不提交表单。

  • 问题内容: 我对此代码有疑问:https : //github.com/reactjs/redux/blob/master/examples/async/containers/App.js 特别: 我猜这是一个两部分的问题。 为什么我需要将句柄更改设置为类的实例,我不能只对handleChange使用静态函数并直接在类中调用它 ? 我不知道这是怎么回事: 谢谢 问题答案: 以相反的顺序回答… 返回

  • 问题内容: 我正在尝试了解如何在Spring应用程序中使用JBoss EAP6。我有一个示例OpenShift应用程序,它包含一个文件。 我找到了有关此文件的一些文档,但是我不清楚为什么以及何时应该在Spring应用程序中使用这些文件。内容如下: 为什么需要声明对模块的依赖关系?JBoss范例中的模块是什么?没有这个xml文件是否可以生存? 问题答案: 只要您的应用程序没有任何类加载问题,就不需要