关于类组件事件绑定的 this 问题

简介: 关于类组件事件绑定的 this 问题

在类组件中,绑定事件(onClick、onKeyPress等)的方式有以下几种,其中比较保险和推荐的还是使用箭头函数 ()=> { } 的方式。如果你觉的箭头函数的写法太长,可以看一下下面这几种改进的方式:

<button onClick = { () => this.addN() } >n+1</button> <!--传一个函数给onClick即可,注意C大写-->
<button onClick = { this.addN } >n+1</button><!--这种写法会有问题! 使得this.addN里的this变成window-->
<button onClick = { this.addN.bind(this) }>n+1</button> <!--对上述问题,可通过 bind 绑定 this,还不如第一种方式-->
<!--但第一种写法代码太长,可在类组件的constructor 中用 this._addN = () => this.addN() 给箭头函数取个名字,然后写成:-->
<button onClick = { this._addN } >n+1</button>
<!--上面这种方法还要写一个 _addN,不如直接将 addN() 方法写到constructor 中,解决了上述的所有问题:-->
constructor(){
    this.addN = ()=> this.setstate({n: this. state.n+1})
}
render(){
    return <button onClick = { this.addN }>n+1</button>
}
<!--但上面这种方式需将 this.addN 写到constructor里,于是React组委会推荐下述的语法糖,它和上述的代码实际上没有区别:-->
class Son extends React.Component{
    addN = () => this. setState({n: this. state.n+1});
    render(){
        return <button onClick = { this. addN }>n+1</button>
    }
}

注意:在类组件中,绑定事件不能在 onClick = { } 花括号内通过 this.addN 的方式直接调用类组件中的方法,这会使得 React 在执行事件时将 this 关键字指向 window。


具体原因是,比如 <button onClick = { this.addN } >n+1</button> 代码,当用户点击按钮时,React 实际上会去调用 button.onClick.call(null,event) 函数,在执行的过程中浏览器会将值为 null 的 this 指向 window,所以会出现上述问题。

目录
相关文章
|
9月前
|
人工智能 Docker 索引
推荐一个双语对照的 PDF 翻译工具的开源项目:PDFMathTranslate
今天给大家推荐一个**双语对照的 PDF 翻译工具**的开源项目:PDFMathTranslate 。
推荐一个双语对照的 PDF 翻译工具的开源项目:PDFMathTranslate
|
8月前
|
消息中间件 存储 NoSQL
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
408 30
|
人工智能
[AI Mem0] 快速开始:智能记忆管理,让你的数据活起来!
[AI Mem0] 快速开始:智能记忆管理,让你的数据活起来!
|
12月前
|
机器学习/深度学习 人工智能 监控
足球预测:进球率预测法的接力人——AI预测
足球预测已有近200年历史,但依赖“自媒体人”推送的方式存在诸多问题。本文介绍了一种基于1990年大卫·杰克逊和K.R.莫舍斯基研究的进球率预测法,通过比较球队平均进球率来预测比赛结果。结合AI技术,该方法可批量处理数据并优化预测模型,提高预测准确性。文中还展示了AI预测的实际应用案例及代码实现,并强调了AI在赛事监控中的重要性。尽管AI预测效果显著,但仍需理性对待。
1071 1
|
Linux
centos之--目录权限配置
CentOS中,可以使用chmod命令来设置文件夹的权限
731 0
|
数据采集 大数据 Python
FFmpeg 在爬虫中的应用案例:流数据解码详解
在大数据背景下,网络爬虫与FFmpeg结合,高效采集小红书短视频。需准备FFmpeg、Python及库如Requests和BeautifulSoup。通过设置User-Agent、Cookie及代理IP增强隐蔽性,解析HTML提取视频链接,利用FFmpeg下载并解码视频流。示例代码展示完整流程,强调代理IP对避免封禁的关键作用,助你掌握视频数据采集技巧。
277 7
FFmpeg 在爬虫中的应用案例:流数据解码详解
|
编解码 开发工具 Android开发
iOS平台如何实现毫秒级延迟的RTMP|RTSP播放器
在我的blog里面,最近很少有提到iOS平台RTMP推送|轻量级RTSP服务和RTMP|RTSP直播播放模块,实际上,我们在2016年就发布了iOS平台直播推拉流、转发模块,只是因为传统行业,对iOS的需求比较少,所以一直没单独说明,本文主要介绍下,如何在iOS平台播放RTMP或RTSP流。
249 6
|
Java Spring
🔥JSF 与 Spring 强强联手:打造高效、灵活的 Web 应用新标杆!💪 你还不知道吗?
【8月更文挑战第31天】JavaServer Faces(JSF)与 Spring 框架是常用的 Java Web 技术。本文介绍如何整合两者,发挥各自优势,构建高效灵活的 Web 应用。首先通过 `web.xml` 和 `ContextLoaderListener` 配置 Spring 上下文,在 `applicationContext.xml` 定义 Bean。接着使用 `@Autowired` 将 Spring 管理的 Bean 注入到 JSF 管理的 Bean 中。
184 0
|
安全 关系型数据库 MySQL
Navicat工具设置MySQL权限的操作指南
通过上述步骤,您可以使用Navicat有效地为MySQL数据库设置和管理用户权限,确保数据库的安全性和高效管理。这个过程简化了数据库权限管理,使其既直观又易于操作。
1071 4
|
监控 Java API
使用Java检测当前CPU负载状态的技术博客
使用Java检测当前CPU负载状态的技术博客
326 0