javascript - react如何处理传递给事件处理程序的函数/回调?
问题描述
我查找了有关此特定问题的不同博客/文档,我了解如何在渲染函数中使用方法之前需要对其进行绑定,但是文档未能详细解释一些事情,函数可以使用不同的方式传递给事件处理程序的是:
// call a already bound funciton
<button onClick={this.sayHello}>
Click me!
</button>
// bind in place
<button onClick={this.sayHello.bind(this)}>
Click me!
</button>
// use es6 arrow functions
<button onClick={() => alert('hello'))}>
Click me!
</button>
反应文档说推荐的方法是绑定一个函数,否则该函数将为组件的每个渲染调用,并且可能会弄乱事情。
但是我找不到为什么每次渲染都会调用它。
但是它不会只有在单击时才被调用吗?
或者
onClick 如何处理或执行 food 下传递的函数?
解决方案
React 使用合成事件。如果您使用的是基于类的组件,则需要将函数范围绑定到 class (only when we do not use arrow functions in our class)
,否则this
关键字的范围会在该函数中丢失。这意味着如果将一个普通的 ES5 函数用作处理程序并且我们在其中使用this.setState()
它,它将无法按预期工作。
如果你arrow function
在你的类中使用作为处理函数,那么不需要将它绑定到类的范围,因为箭头函数的范围是它上面的一个执行上下文。
如果您使用的是功能组件。没有this
可用的关键字,您直接调用函数(函数本身外部或内部的处理程序)
现在:让我解释一下语法:
语法 1:
// call a already bound funciton
<button onClick={this.sayHello}>
Click me!
</button>
sayHello
您将在类 Component 中简单地使用名称(如下所示)的事件处理程序。
sayHello(){ ... } // Binded in constructor by doing this.sayHello = this.sayHello.bind(this)
或者
sayHello = ()=>{}
当单击按钮时,将调用/调用处理程序。
语法 2:
// bind in place
<button onClick={this.sayHello.bind(this)}>
Click me!
</button>
这种语法是this
在我们的处理函数sayHello
中绑定关键字语法的另一种简单方法,原因与我在上面提到的相同。
语法 3:
// use es6 arrow functions
<button onClick={() => sayHello('hello'))}>
Click me!
</button>
每当我们想将参数传递给处理函数时,我们都会使用这种语法。因此,在这种情况下,当单击按钮时,我们的sayHello
函数会获取一个值“hello”作为参数。
你最后的怀疑:当 React 文档说该函数将在每次渲染组件时调用,并且可能会弄乱事情。它们的意思是,如果您在使用()=>{}
语法的元素内错误地使用事件处理程序并且还在其中使用 a this.setState()
,它将强制重新渲染。因为这就是setState()
重新渲染我们的组件。当它到达同一行代码时,它会再次重新渲染,这最终会破坏我们的应用程序。
推荐阅读
- javascript - 我正在尝试将 TypeScript 的示例翻译成 JavaScript,但我不知道如何转换它
- python - 如何在 python 对象中覆盖 __type__ 方法?
- python - 为什么我从上一个问题中提取的代码多处理池映射挂起?
- reactjs - 如何将坐标数组传递给 react-map-gl 热图图层?
- javascript - Razor 页面中的最佳实践:使用 AJAX 或处理程序进行发布/获取请求
- python - 如何从列表中删除项目并将其分配给变量?
- ios - 从 Firebase 获取数据的更快方法?
- node.js - graphql-modules 不调用 __resolveType
- java - 二叉树中通用节点的Java数组,无法创建零节点
- oracle - 如果我们在 oracle 中创建表或索引时不添加表空间子句,是否会产生重大影响?