【鸿蒙】鸿蒙开发过程中this指向问题

文章目录

    • 什么是 `this`?
    • 常见 `this` 指向问题
    • 案例分析:HarmonyOS 组件中的 `this` 指向问题
      • 问题描述
      • 问题分析
      • 原因
    • 解决方案:绑定 `this` 的正确方法
      • 方法一:使用箭头函数
      • 方法二:手动绑定 `this`
    • 完整代码示例
      • 使用箭头函数
      • 使用 `bind` 方法
    • 总结

在 TypeScript 开发中,尤其是在使用面向对象编程(OOP)或基于组件的框架(如 HarmonyOS)时,this 的指向问题是一个常见且容易引发错误的挑战。本文将深入探讨 this 的绑定机制,并通过一个实际案例,展示如何在 TypeScript 中正确处理 this 的指向问题。

什么是 this

在 TypeScript 中,this 是一个关键字,代表当前对象的上下文。它指向调用该函数的对象,具体指向取决于函数的调用方式。

  • 全局上下文this 指向全局对象(在浏览器中是 window,在 Node.js 中是 global)。
  • 对象方法this 指向调用该方法的对象。
  • 构造函数this 指向新创建的对象。
  • 箭头函数this 指向定义时的上下文,而不是调用时的上下文。

常见 this 指向问题

在 TypeScript 开发中,this 指向问题通常出现在以下几种情况:

  1. 回调函数中的 this:当一个方法作为回调函数传递给其他函数时,this 的指向可能会丢失。例如,在事件处理程序中,this 可能指向触发事件的元素,而不是组件实例。
  2. 嵌套函数中的 this:在嵌套函数中,this 的指向可能会发生变化,导致无法访问到预期的对象属性。
  3. 类方法作为参数传递:当类的方法被作为参数传递给其他函数时,this 的指向可能会丢失。

案例分析:HarmonyOS 组件中的 this 指向问题

在这里插入图片描述
需求:要根据上图,实现父组件与子组件联动的功能

问题描述

我们来看一个 HarmonyOS 组件的示例,其中包含一个 PropCase1 组件和一个 myProp 子组件。

@Entry
@Component
struct PropCase1 {@State num: number = 0syncData(s: number) {this.num = s}build() {Column({ space: 10 }) {Text(`父组件计算器:${this.num}`)Button('点击+1').width(100).height(50).borderRadius(20).onClick(() => {this.num++})Divider().color(Color.Gray).width('100%').strokeWidth(1)// 写法1// myProp({ num: this.num, f: (s: number) => {//   this.num = s// }})// 写法2myProp({ num: this.num, f: this.syncData })}.height('100%').width('100%')}
}@Component
struct myProp {@Propnum: number;f: (s: number) => void = this.myFunmyFun(s: number): void { }@State action: boolean = falsebuild() {Column({ space: 10 }) {Text(`子组件计算器:${this.num.toString()}`)Button('点击+1').width(80).height(40).borderRadius(15).onClick(() => {this.num++this.f(this.num)})}}
}

问题分析

在上述代码中,PropCase1 组件将 syncData 方法作为回调函数传递给 myProp 子组件:

myProp({ num: this.num, f: this.syncData })

然而,当 myProp 子组件调用 f(this.num) 时,this.numsyncData 方法中并没有正确更新父组件的 num,导致父组件无法接收到变化。

原因

  • 上下文丢失:在写法2中,syncData 方法在子组件中调用时,this 指向的是子组件,而不是父组件。因此,this.num 实际上是指向子组件的 num,而不是父组件的 num
  • 解决方法:需要确保 syncData 方法的 this 正确绑定到父组件。

解决方案:绑定 this 的正确方法

方法一:使用箭头函数

箭头函数不会创建自己的 this,它会捕获定义时的 this 上下文。因此,使用箭头函数可以确保 this 始终指向父组件。

myProp({ num: this.num, f: (s: number) => {this.num = s
}})

优点

  • 简单直接,不需要手动绑定 this
  • 箭头函数自动捕获父组件的 this 上下文。

方法二:手动绑定 this

如果使用普通函数,需要手动绑定 this,可以使用 bind 方法,或者使用箭头函数定义方法。

使用 bind 方法

myProp({ num: this.num, f: this.syncData.bind(this) })

使用箭头函数定义方法

syncData = (s: number) => {this.num = s
}

然后在传递时:

myProp({ num: this.num, f: this.syncData })

优点

  • 更加灵活,可以在需要时动态绑定 this
  • 适用于需要在多个地方使用同一个方法的情况。

完整代码示例

以下是使用箭头函数和 bind 方法的完整代码示例:

使用箭头函数

@Entry
@Component
struct PropCase1 {@State num: number = 0syncData(s: number) {this.num = s}build() {Column({ space: 10 }) {Text(`父组件计算器:${this.num}`)Button('点击+1').width(100).height(50).borderRadius(20).onClick(() => {this.num++})Divider().color(Color.Gray).width('100%').strokeWidth(1)// 使用箭头函数myProp({ num: this.num, f: (s: number) => {this.num = s}})}.height('100%').width('100%')}
}

使用 bind 方法

@Entry
@Component
struct PropCase1 {@State num: number = 0syncData(s: number) {this.num = s}build() {Column({ space: 10 }) {Text(`父组件计算器:${this.num}`)Button('点击+1').width(100).height(50).borderRadius(20).onClick(() => {this.num++})Divider().color(Color.Gray).width('100%').strokeWidth(1)// 使用 bind 方法myProp({ num: this.num, f: this.syncData.bind(this) })}.height('100%').width('100%')}
}

总结

在 TypeScript 中,this 的指向问题是一个常见的挑战,尤其是在处理回调函数和方法引用时。通过使用箭头函数或手动绑定 this,可以确保 this 始终指向预期的对象。

  • 箭头函数 是最简单的方法,因为它自动捕获定义时的 this 上下文。
  • 手动绑定 提供了更大的灵活性,适用于需要在多个地方使用同一个方法的情况。

通过正确处理 this 的指向,可以避免许多潜在的错误,并确保应用程序的稳定性和可维护性。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【摸鱼】Docker配置主从mysql数据库环境

docker pull mysql拉取docker镜像,国内现在访问不了docker hub,可以去阿里云上镜像加速器地址https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors启动主库docker run -p 3306:3306 --name master-mysql --privilegedtrue -v /app/docker/data…

初试无监督学习 - K均值聚类算法

文章目录 1. K均值聚类算法概述2. k均值聚类算法演示2.1 准备工作2.2 生成聚类用的样本数据集2.3 初始化KMeans模型对象,并指定类别数量2.4 用样本数据训练模型2.5 用训练好的模型生成预测结果2.6 输出预测结果2.7 可视化预测结果 3. 实战小结 1. K均值聚类算法概述…

大数据笔记

第一章、大数据概述 人类的行为及产生的事件的一种记录称之为数据。 1、大数据时代的特征,并结合生活实例谈谈带来的影响。 (一)特征 1、Volume 规模性:数据量大。 2、Velocity高速性:处理速度快。数据的生成和响…

深度学习实战老照片上色

目录 1.研究背景与意义1. 卷积神经网络(CNN)在老照片上色中的应用1.1 卷积层与特征提取1.2 颜色空间转换1.3 损失函数与训练优化 2. 生成对抗网络(GAN)在老照片上色中的应用2.1 生成器与判别器2.2 对抗训练2.3 条件生成对抗网络&a…

C#面向对象,封装、继承、多态、委托与事件实例

一.面向对象封装性编程 创建一个控制台应用程序,要求: 1.定义一个服装类(Cloth),具体要求如下 (1)包含3个字段:服装品牌(mark),服装…

养老院、学校用 安科瑞AAFD-40Z单相电能监测故障电弧探测器

安科瑞戴婷 Acrel-Fanny 安科瑞单相电能监测故障电弧探测器对接入线路中的故障电弧(包括故障并联电弧、故障串联电弧)进行有效的检测,当检测到线路中存在引起火灾的故障电弧时,探测器可以进行现场的声光报警,并将报警…

PAT甲级 1056 Mice and Rice(25)

文章目录 题目题目大意基本思路AC代码总结 题目 原题链接 题目大意 给定参赛的老鼠数量为NP,每NG只老鼠分为一组,组中最胖的老鼠获胜,并进入下一轮,所有在本回合中失败的老鼠排名都相同,获胜的老鼠继续每NG只一组&am…

[SWPUCTF 2021 新生赛]include

参考博客: 文件包含 [SWPUCTF 2021 新生赛]include-CSDN博客 NSSCTF | [SWPUCTF 2021 新生赛]include-CSDN博客 考点:php伪协议和文件包含 PHP伪协议详解-CSDN博客 php://filter php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当…

spring boot3.3.5 logback-spring.xml 配置

新建 resources/logback-spring.xml 控制台输出颜色有点花 可以自己更改 <?xml version"1.0" encoding"UTF-8"?> <!--关闭文件扫描 scanfalse --> <configuration debug"false" scan"false"><springProperty …

Unity shaderlab 实现LineSDF

实现效果&#xff1a; 实现代码&#xff1a; Shader "Custom/LineSDF" {Properties{}SubShader{Tags { "RenderType""Opaque" }Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{floa…

PHP 去掉特殊不可见字符 “\u200e“

描述 最近在排查网站业务时&#xff0c;发现有数据匹配失败的情况 肉眼上完全看不出问题所在 当把字符串 【M24308/23-14F‎】复制出来发现 末尾有个不可见的字符 使用删除键或左右移动时才会发现 最后测试通过 var_dump 打印 发现这个"空字符"占了三个长度 &#xf…

Web会话安全测试

Web会话安全测试 - 知乎 1、会话ID不可预测性 【要求】 会话ID必须采用安全随机算法&#xff08;如SecureRandom&#xff09;生成&#xff0c;并且强度不得低于256位&#xff08;32字符&#xff09;&#xff0c;如采用Tomcat原生JSESSIONID【描述】 密码与证书等认证手段&…

springboot336社区物资交易互助平台pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 社区物资交易互助平台设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff…

富文本编辑器图片上传并回显

1.概述 在代码业务需求中&#xff0c;我们会经常涉及到文件上传的功能&#xff0c;通常来说&#xff0c;我们存储文件是不能直接存储到数 据库中的&#xff0c;而是以文件路径存储到数据库中&#xff1b;但是存储文件的路径到数据库中又会有一定的问题&#xff0c;就是 浏览…

结构体详解+代码展示

系列文章目录 &#x1f388; &#x1f388; 我的CSDN主页:OTWOL的主页&#xff0c;欢迎&#xff01;&#xff01;&#xff01;&#x1f44b;&#x1f3fc;&#x1f44b;&#x1f3fc; &#x1f389;&#x1f389;我的C语言初阶合集&#xff1a;C语言初阶合集&#xff0c;希望能…

学习ASP.NET Core的身份认证(基于Session的身份认证1)

ASP.NET Core使用Session也可以实现身份认证&#xff0c;关于Session的介绍请见参考文献5。基于Session的身份认证大致原理就是用户验证成功后将用户信息保存到Session中&#xff0c;然后在其它控制器中从Session中获取用户信息&#xff0c;用户退出时清空Session数据。百度基于…

题目 3209: 蓝桥杯2024年第十五届省赛真题-好数

一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位 &#xff09;上的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位 &#xff09;上的数字是偶数&#xff0c;我们就称之为“好数”。给定一个正整数 N&#xff0c;请计算从…

人工智能如何改变你的生活?

在我们所处的这个快节奏的世界里&#xff0c;科技融入日常生活已然成为司空见惯的事&#xff0c;并且切实成为了我们生活的一部分。在这场科技变革中&#xff0c;最具变革性的角色之一便是人工智能&#xff08;AI&#xff09;。从我们清晨醒来直至夜晚入睡&#xff0c;人工智能…

MATLAB - ROS2 ros2genmsg 生成自定义消息(msg/srv...)

系列文章目录 前言 语法 ros2genmsg(folderpath)ros2genmsg(folderpath,NameValue) 一、说明 ros2genmsg(folderpath) 通过读取指定文件夹路径下的 ROS 2 自定义信息和服务定义来生成 ROS 2 自定义信息。函数文件夹必须包含一个或多个 ROS 2 软件包。这些软件包包含 .msg 文件…

LeetCode:19.删除链表倒数第N个节点

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;19.删除链表倒数第N个节点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表…