javascript - .bind this 在类方法中
问题描述
我试图了解如何做出反应,我在 youtube 上偶然发现了这个很棒的视频。在这里,他做了类似的事情。
首先我们创建了一个createElement
react函数
function createElement (el, props, ...children ) {
return div(el,props,children)
}
function div (el, props, children) {
// checking if element is class
if (isClass(el)) {
return HandleClass(el, props)
// more code but skipping adding it since it is irrelevant
function HandleClass (classComponent, props) {
const component = new classComponent(props)
return component.render()
}
window.React = {
createElement
}
和看起来像这样的 React Class 组件
class Hello extends React.Component {
constructor(props) {
super(props)
this.state = {
value: 0
}
}
onPlusClick () {
this.setState({value: this.state.value + 1})
}
onMinusClick () {
this.setState({value: this.state.value - 1})
}
render () {
return React.createElement('div', null,
React.createElement('h1', null, 'This is famour foo counter app'),
React.createElement('h1', null, `Counter Value: ${this.state.value}`),
React.createElement('button', {onClick: this.onPlusClick.bind(this)}, '+'), //TODO: What does .bind here mean
React.createElement('button', {onClick: this.onMinusClick.bind(this)}, '-') //TODO: What does .bind here mean
)
}
}
现在,在这里我不明白onClick: this.onMinusClick.bind(this)
(在上面的课程中)。有人可以向我解释一下吗?在我个人的 react 项目中,我从来不需要使用 bind 来添加点击事件
谢谢
解决方案
这在react docs中得到了很好的解释。从文档:
您必须小心 JSX 回调中 this 的含义。在 JavaScript 中,默认情况下不绑定类方法。如果您忘记绑定 this.handleClick 并将其传递给 onClick,则在实际调用该函数时 this 将是未定义的。
这不是 React 特有的行为;它是 JavaScript 中函数工作方式的一部分。一般如果引用的方法后面不带(),比如onClick={this.handleClick},就应该绑定那个方法。
换句话说,您编写为类的方法的任何函数都不知道this
当您在该函数中使用它时意味着什么。所以用你的类方法onPlusClick
,你要求它this.setState({ ... ])
。但在该方法内部,它本身并不知道this
指的是什么。您必须告诉它您希望this
类方法内部引用您当前所在的类组件。因此需要bind
声明。
bind
如果您使用箭头功能,您可能从来不需要使用过。箭头函数保留 的上下文this
,这意味着当您this
在箭头函数中使用单词时,它会自动假定 的含义与this
编写箭头函数的上下文中的含义相同。
希望这可以为您解决问题。
推荐阅读
- amazon-dynamodb - DynamoDB TTL 是否适用于预先存在的项目?
- python - 使用 pandas (Python) 打开 .dat 文件
- python - 如何在 python 中为多个类别运行帖子?
- git - 合并后 2 个 git 分支应该相同,但不是
- java - java 11无法生成GC日志
- c - CMock 模拟一些功能,但不是来自同一模块的其他功能
- ansible - 如何替换表达式中的 Jinja2 表达式?
- laravel - Laravel 7 在更新功能更新错误
- yocto - LIBSDL2 + DirectFB + i.MX 6 - 只有软件 blitting?
- c++ - 为什么我的应用程序在 Windows 10 上使用更多内存?