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

为什么以及何时需要在React中绑定函数和eventHandler?

洪增
2023-03-14
问题内容

class SomeClass extends Component{
someEventHandler(event){
}
render(){
return
}
}

我看到------here------零件的不同版本。

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

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

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

版本有何不同?还是只是偏爱问题?


问题答案:

绑定不是特定于React的东西,而是this在Javascript中的工作方式。每个函数/块都有其自己的上下文,对于函数而言,其功能更特定于其调用方式。当添加ES6支持(类语法)时,React团队决定this不绑定类的自定义方法(也不是诸如的内置方法componentDidMount)。

何时绑定上下文取决于函数的用途,如果您需要访问类的props,state或其他成员,则需要对其进行绑定。

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

预绑定到您的班级

.bind(this)用于将该上下文绑定到您的组件函数。但是,它在每个渲染周期都返回一个新的函数引用!如果您不想绑定该函数的每种用法(例如单击处理程序中的绑定),则可以预绑定该函数。

一种。 在构造函数中进行绑定。又名

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

b。 使您的自定义函数在类的胖箭头函数上。又名

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

运行时绑定到您的课程

几种常用的方法

一种。 您可以使用内联lambda(胖箭头)函数包装组件处理函数。

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

这可以提供其他功能,例如是否需要为点击处理程序传递其他数据<input onChange={(event) => { this.someEventHandler(event, 'username') }>。同样可以做到bind

b。 您可以.bind(this)如上所述使用。

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

带有其他参数 <input onChange={ this.someEventHandler.bind(this, 'username') }>

如果要避免创建新的函数引用,但仍需要传递参数,则最好将其抽象为子组件。

在你的例子中

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

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

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

另一个运行时绑定到您的类。

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

您只是将函数作为回调函数传递,以在单击事件发生时触发,而没有其他参数。请确保预先绑定!

总结一下。考虑如何优化代码很不错,每种方法都有一个实用工具/目的取决于您的需求。



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

  • 所有其他唤醒锁都是有意义的,例如开发人员希望在执行某些操作时屏幕不会关闭。但在部分唤醒锁定文档中说: 如果您保持部分唤醒锁定,CPU将继续运行,而不考虑任何显示超时或屏幕状态,甚至在用户按下电源按钮后。在所有其他唤醒锁中,CPU将运行,但用户仍可以使用电源按钮将设备置于睡眠状态。 这是否意味着在执行某些操作时CPU可能会关闭?是否需要在服务中获取唤醒锁?

  • 问题内容: 试图弄清楚React的基础知识。 查看此页面上的第二个示例:https : //facebook.github.io/react/ 我看到tick()函数设置Timer类的状态,将前一个值加1。 但是,当我尝试实现自己的简单Counter类时,它失败了,并且出现控制台错误,提示 无法读取未定义的setState属性。 一些谷歌搜索显示我必须将其绑定到增量函数。但是,为什么在我看到的第一

  • 问题内容: 我们都知道我们需要在React中绑定函数以使其起作用。我知道为什么我们需要绑定它。 但是我不确定为什么我们不需要绑定箭头功能。 示例:使用箭头功能(无需绑定) }; 现在,使用功能(需要绑定) }; 我不是在问为什么我们需要绑定功能。我只想知道为什么箭头功能不需要绑定。 谢谢。 问题答案: 仅仅因为arrow函数的上下文中没有以下内容: 这个 论点 超 新目标 所以,当你引用此箭头功能

  • 问题内容: 令我惊讶的是,StackOverflow上没有人问过这个问题。 通过JSON对象文档和快速的Google搜索无法获得令人满意的结果。 有什么好处?它是如何工作的? 编辑:为了清楚起见,请看一下这个展平/未展平的示例。 谢谢。 问题答案: 在许多情况下,您会获得由某些库自动构建的JSON文本。在整个编程语言中,有许多库构建JSON文本(此处是一个示例 每当库添加一些其他对象或数组包装时,