javascript - 在 React 中,为什么我们在箭头函数中调用它?
问题描述
我有一个问题..请告诉我..
import React, { Component } from "react";
class App extends Component {
constructor(props) {
super(props);
}
handleClick = () => {
console.log("clicking")
};
render() {
return (
<div>
<ul>
{this.state.letters.map((letter) => (
<li onClick={() => this.handleClick()}> // when clicking li, it works.
<li onClick={() => handleClick()}> // when clicking li, it does not works why????
hello
</li>
))}
</ul>
</div>
);
}
}
export default App;
这是非常简单的代码。
我的问题是为什么我们要这样写 this.handleClick ??
在我看来,
- 单击 li 标签时。
- this.handleClick 函数在箭头函数中!!
- 所以,箭头函数会自动绑定 this
- (在这种情况下,这是绑定到 App 组件)
- 因此,在箭头函数中,只能找到handleClick,(//在我的想法中)
- 因为this.handleClick可以找到!
- 但是,只写handleClick 是行不通的.. ? 为什么 ??// handleClick 未找到错误...
你能解释为什么会这样吗?
此外..
如果我更改了 <li onClick={() => console.log(this)} /> 之类的代码
我们可以看到这是 App 组件。同样在 App 组件中,我们可以看到 handleClick 功能...
所以,这是绑定到App Component,然后我想在箭头函数中,可以找到handleClick()函数。但是没有找到……为什么??
解决方案
您似乎对箭头功能的含义感到困惑,用您的话来说是“自动绑定它”。从技术上讲,这不是正在发生的事情。请参阅 MDN 文章: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
它们不会自动绑定this
,它们根本不会创建新this
绑定(与函数相反,函数本身会创建新this
绑定)。虽然您可以认为它是“自动”绑定this
,但实际上并非如此。一个关键点是它只影响箭头函数范围内this
的含义。它与函数之外的内容无关。因此,您定义为箭头函数这一事实与您是否可以使用它无关。它只影响函数本身所指的内容。this
handledClick
this
this
所有这一切都解释了为什么调用this.handleClick
会在你的. 范围内没有函数。有一个(组件的实例),它恰好有一个方法。render
handleClick
handleClick
render
this
handleClick
在这种情况下使用箭头函数很有用,因为您不必重新绑定它。如果你的handleClick
函数需要访问this.state
or this.props
,它就可以了。如果您将其定义为标准function
,则需要重新绑定它,以便在this
调用它时可以使用正确的。
正如其他人指出的那样,您的代码可能无法正常工作。您应该删除包装它们的箭头函数。照原样,您只是调用一个返回该函数的handleClick
函数,而不是调用它。
推荐阅读
- javascript - 如何删除一些空的关闭和打开 div?
- node.js - 如何在运行节点的 Azure Function 中获取 Claims Principal?
- maven - 无法从 Pentaho Nexus 下载库
- elasticsearch - 在 Elastic 开发工具查询中使用 AND 和 OR
- python - python-socketio 客户端到客户端消息传递
- wordpress - 带有 WordPress 的 XAMPP - 缺少仪表板
- vuejs3 - Vue3 手表在 Options api 方式中不起作用
- microservices - 如何根据 Key/Value 动态地将消息路由到微服务实例?
- android - 分页 3 RemoteMediator 和 SavedStateHandle
- android - 在android中询问权限是否有任何限制?