三种方法解决React类组件中this指向问题

news2024/9/20 12:38:56

从onClick事件不加括号说起

import React from 'react'
import './App.css'
class TestComponent extends React.Component {
  clickHandler () {
    console.log('111')
    console.log('this指向:', this)
  }
  render () {
    return (
      <button onClick={this.clickHandler()}>点击我</button>
    )
  }
}
function App () {
  return (
    <div>
      <TestComponent></TestComponent>
    </div>

  )
}

export default App

预想的功能是点击按钮后控制台输出111和this指向,但实际是渲染后会立即执行此方法,不用点击按钮,已经输出了对应信息:

在这里插入图片描述
这是因为在react的jsx语法中,{}的作用就是执行,在js表达式中加()相当于是调用函数,也就是this.clickHandler被立即执行了。

不加()会怎么样?刷新页面,没有输出信息,点击按钮,输出了信息,看起来好像解决了问题,但此时会发现this指向变了:
在这里插入图片描述

解决方法

解决上述this指向问题,有三种解决方法

1. public class fields(最推荐)

文档
用法:使用箭头函数形式的实例方法,clickHandler = () => {}

import React from 'react'
import './App.css'
class TestComponent extends React.Component {
  clickHandler = () => {
    console.log('111')
    console.log('this指向:', this)
  }
  render () {
    return (
      <button onClick={this.clickHandler}>点击我</button>
    )
  }
}
function App () {
  return (
    <div>
      <TestComponent></TestComponent>
    </div>

  )
}

export default App

2. 箭头函数

箭头函数特点:

  1. 箭头函数声明赋值给点击事件,但未执行,只有触发点击后才会被执行
  2. 箭头函数中的this实际是外层函数的this

用法:在事件绑定位置使用箭头函数,onClick={() => this.clickHandler()}

import React from 'react'
import './App.css'
class TestComponent extends React.Component {
  clickHandler () {
    console.log('111')
    console.log('this指向:', this)
  }
  render () {
    return (
      <button onClick={() => this.clickHandler()}>点击我</button>
    )
  }
}
function App () {
  return (
    <div>
      <TestComponent></TestComponent>
    </div>

  )
}

export default App

3. constructor 中通过bind绑定this

相当于在类组件初始化阶段就将回调函数的this修正为永远指向当前组件实例对象,this.clickHandler = this.clickHandler.bind(this)

import React from 'react'
import './App.css'
class TestComponent extends React.Component {
  constructor() {
    super()
    this.clickHandler = this.clickHandler.bind(this)
  }
  clickHandler () {
    console.log('111')
    console.log('this指向:', this)
  }
  render () {
    return (
      <button onClick={this.clickHandler}>点击我</button>
    )
  }
}
function App () {
  return (
    <div>
      <TestComponent></TestComponent>
    </div>

  )
}

export default App

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习实战4:基于马尔科夫随机场的图像分割(附Python代码)

目录0 写在前面1 图像分割问题2 图像像素邻域3 观测场与标记场4 马尔科夫随机场建模5 Python实现5.1 计算能量函数5.2 退火优化5.3 效果展示0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&a…

分享6个对象数组去重的方法

大家好&#xff0c;关于对象数组去重的业务场景&#xff0c;想必大家都遇到过类似的需求吧&#xff0c;针对这样的需求&#xff0c;你是怎么做的呢。下面我就先和大家讨论下基于对象的某个属性如何去重。方法一&#xff1a;使用 .filter() 和 .findIndex() 相结合的方法使用 fi…

基于AD Event日志监测AdminSDHolder

01、简介 AdminSDHolder是一个特殊的AD容器&#xff0c;通常作为某些特权组成员的对象的安全模板。Active Directory将采用AdminSDHolder对象的ACL并定期将其应用于所有受保护的AD账户和组&#xff0c;以防止意外和无意的修改并确保对这些对象的访问是安全的。如果攻击者能完全…

## Leetcode刷题Day24-------------------回溯算法

Leetcode刷题Day24-------------------回溯算法 1. 理论基础 题目链接/文章讲解&#xff1a;https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html视频讲解&#xff1a;https://www.bilibili.com/video/BV1cy4y167mM …

Linux文件目录与路径、内容查找命令及文件颜色知识总结

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

SpringBoot 整合Shiro实现动态权限加载更新+Session共享+单点登录

一.说明 Shiro是一个安全框架,项目中主要用它做认证,授权,加密,以及用户的会话管理,虽然Shiro没有SpringSecurity功能更丰富,但是它轻量,简单,在项目中通常业务需求Shiro也都能胜任. 二.项目环境 MyBatis-Plus版本: 3.1.0 SpringBoot版本:2.1.5 JDK版本:1.8 Shiro版本:1.4…

ASUS X415安装系统找不到硬盘解决办法

同事让我帮忙安装系统&#xff0c;笔记本电脑型号是ASUS X415。原本以为是手到擒来的事情&#xff0c;结果我在上面还是消耗了不少时间。 现象 老毛桃PE 无法识别到硬盘。微PE可以识别到硬盘&#xff0c;但是系统安装以后&#xff0c;无法正常启动。启动出现蓝屏。或者无限等…

codewars闯关玩耍1

codewars闯关玩耍1 codewars网址&#xff1a;https://www.codewars.com/dashboard 大一时在知乎上看到的网站&#xff0c;然后 点击、收藏、吃灰 一键三连&#xff0c;最近翻收藏夹的时候突然又看见了决定进来玩玩&#xff0c;练练英语&#xff0c;巩固下python 以后此系列&a…

javaweb10 JSP语法、JSTL、EL表达式、JSP标签、九大内置对象

文章目录一、JSP简介二、JSP原理三、JSP语法四、JSP指令五、九大内置对象六、EL表达式七、JSP标签八、JSTL标签一、JSP简介 JSP&#xff08;java sever pages&#xff09;&#xff1a;java服务器端页面&#xff0c;和servlet一样&#xff0c;用于动态web技术 写JSP就像在写HTM…

中国to B应用软件的突破之路

我曾经随手画过一个很简单的图&#xff1a;我就分为供需两端。&#xff08;1&#xff09;如何让生意越做越大&#xff1f;那就在需侧&#xff0c;增加尽量多的交互。有人理解在营销环节-客户关系触点经营&#xff0c;有人理解在销售环节-多渠道多业态销售&#xff08;如电话销售…

振弦采集模块配置工具VMTool生成寄存器值

振弦采集模块配置工具VMTool生成寄存器值 生成寄存器值 VMXXX 有很多按位使用的寄存器&#xff0c; 使用 VMTool 工具可进行方便的设置&#xff0c;当需要知道寄存器的实际值时&#xff0c;可通过以下两种方法获取。 &#xff08;保持【 自动读取】 复选框为非选中状态&#xf…

Unity 简易音乐播放系统

前言 众所周知, Unity自带音效播放没有回调,不能自动播放clip列表; 所以简单实现一个带自动播放功能的接口,用以实现音乐列表的逐个播放. 一. 功能分析 首先要求切换场景时音乐不停,只在需要时播放其次即传入音乐名和播放次数,即可将该音乐循环播放指定次数可以直接传入一个…

【OpenCV 例程 300篇】256. 特征检测之 CenSurE(StarDetector)算法

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】256. 特征检测之 CenSurE&#xff08;StarDetector&#xff09;算法 6.9.1 算法简介 中心环绕算法&#xff08;Center Surround Extremas, CenSurE&#xff09;是 Agrawal M 等于 2008年提出的关键…

K8S StatefulSet基本使用

K8S StatefulSet 清空K8S对象 为了避免之前学习的内容造成的影响&#xff0c;先手动把K8S集群中的所有对象清空&#xff0c;使用一个全新的环境来学习StatefulSet的基本使用。 查看对象 查看service对象 kubectl get services查看ReplicaSet对象 kubectl get rs查看Repli…

达梦数据库导入dmp文件

找到达梦数据库安装文件的bin目录按着Shift键&#xff0c;右键输入以下命令&#xff08;注意更改参数&#xff09;.\dimp DGYH(用户名)/DGYH(密码)127.0.0.1 FILEdmp所在文件夹路径\20230103.dmp fullY然后根据提示,写Y 或 N 回车即可注意&#xff1a;若导入成功&#xff0c;但…

Java9的新特性模块化(Module)

一、 模块化是什么&#xff1f; Java 9引入了模块化系统&#xff0c;称为"Java Platform Module System"&#xff08;JPMS&#xff09; 这个系统允许将Java程序分成模块&#xff0c;每个模块都有自己的规范&#xff0c;可以明确地声明它依赖于哪些其他模块&#xff…

小波分析在电力系统暂态信号处理中的应用

前面我们主要讲了小波分析在机械振动信号或者其他时间序列中的应用 基于小波包特征提取和随机森林的CWRU轴承数据集故障识别 - 哥廷根数学学派的文章 - 知乎 https://zhuanlan.zhihu.com/p/556172942 基于小波区间相关&#xff08;Interval-Dependent&#xff09;的信号降噪方…

nacos源码分析-心跳检测(服务端)

前言 前面我们讲了《nacos源码分析-服务注册(客户端)》 和 《nacos源码分析-服务注册(服务端)》&#xff0c;主要是讲的服务注册流程&#xff0c;本章节我们来讲服务心跳检测机制。 心跳续约客户端 其实我们在讲 nacos服务注册客户端的时候顺带就说了心跳&#xff0c;服务注…

iNav飞控AOCODARC-F7MINI固件编译

iNav飞控AOCODARC-F7MINI固件编译1. 编译目标&#xff08;AOCODARC-F7MINI&#xff09;2. 编译步骤Step 1 软件配置环境准备Step 2 获取开源代码Step 3 构建命令介绍Step 4 厂家目标板查询Step 5 目标固件编译Step 6 目标固件清理3. 参考资料iNav是一款非常出色的飞控航模开源软…