ArkUI基础篇-组件事件

ArkUI基础篇-组件事件

按钮的点击,移动,文本框内容的改变等等,都叫事件,一旦有事件,那么就可能需要处理

一、事件操作

ArkTs语言中,事件处理的模型

  • 对象.事件类型(回调函数),回调函数我们自己定义的,当系统发生事件后会调用函数

1.1 外部定义回调函数

外部编写回调函数可以增加代码的整洁行

但是缺点也很明显:

  • 不能在外部操作组件的数据
  • 若想传递参数不能直接将回调方法作为事件的参数进行传递

最后只有事件3是成功改变值的

ets 复制代码
/*
 * 事件处理界面
 * */

@Entry
@Component
struct ArkUIPage {
  @State message: string = 'Hello World';

  build() {
    Column({space:10}) {
      Text(this.message)
        .fontSize(40)
      // Button("点击事件").onClick(回调函数)
      Button("点击事件1")
        .onClick(clickFn1)
      Button("点击事件2")
        .onClick(() => {
          clickFn2(this.message)
        })
      Button("点击事件3")
        .onClick(() => {
          this.message = clickFn3(this.message)
        })
    }
    .height('100%')
    .width('100%')
  }
}

/*
 * 外部定义回调函数
 * 不好使用this直接调用做键内部的参数
 * 所以不能访问结构体内部的数据
 * */

function clickFn1() {
  console.log("this is clickFn1")
}

function clickFn2(msg: string) {
  msg = "123"
  console.log("this is clickFn2", msg)
}

function clickFn3(msg: string) {
  msg = "123"
  console.log("this is clickFn3")
  return "123"
}

1.2 内部定义回调函数

  • clickFn内部定义的函数不能直接作为事件的参数,因为在一般函数中,this指向的是调用者,如果以这种形式依旧使用this会报错
  • clickFn2内部定义的函数不能直接作为事件的参数,箭头函数本身是没有this的,this会指向上一级,所以clickFn2this指向的是组件本身
ets 复制代码
/*
 * 事件处理界面
 * */

@Entry
@Component
struct ArkUIPage {
  @State message: string = 'Hello World';

  // 内部定义的函数不能直接作为事件的参数,因为在一般函数中,this指向的是调用者
  clickFn() {
    console.log("this is inner clickFn1")
    console.log("this = ", this)
    this.message = "inner"
  }
  // 内部定义的函数不能直接作为事件的参数,箭头函数本身是没有this的,this会指向上一级,所以clickFn2的this指向的是组件本身
  clickFn2 = () => {
    console.log("this is inner clickFn2")
    console.log("this = ", this)
    this.message = "inner"
  }

  build() {
    Column({space:10}) {
      Text(this.message)
        .fontSize(40)
      // Button("点击事件").onClick(回调函数)
      Button("内部点击事件1")
        .onClick(this.clickFn)
      Button("内部点击事件2")
        .onClick(this.clickFn2)
    }
    .height('100%')
    .width('100%')
  }
}

clickFn不能直接作为参数的原因是,他只是个被调用的参数,被接收到会以fn(fn是示例名),理解为fn接收参数fn=this.clickFn,最后是被直接调用的方式是fn()并没有触发者,因此是没有this,所以直接作为参数的话,内部的thisundefined,因此需要

javascript 复制代码
Button("内部点击事件1调整")
  .onClick(() => {
    console.log("这是变换调用的clickFn")
    this.clickFn()
  })

这样就是this调用的clickFn,所以内部的this是外部的调用者this

而箭头函数形式的回调参数,this是指向上一级的,因此内部即便没有通过this.fn()调用也会指向上层的this

相关推荐
nashane7 小时前
HarmonyOS 6学习:外接键盘CapsLock与长截图功能的实战调试与完整解决方案
学习·华为·计算机外设·harmonyos
aqi0014 小时前
一文理清 HarmonyOS 6.0.2 涵盖的十个升级点
android·华为·harmonyos·鸿蒙·harmony
环信即时通讯云16 小时前
环信Flutter UIKit适配鸿蒙实战指南
flutter·华为·harmonyos
Swift社区17 小时前
鸿蒙 PC 应用启动优化全解析
华为·harmonyos
richard_yuu18 小时前
鸿蒙本地数据存储实战|Preferences 封装、数据隔离与隐私合规存储方案
android·华为·harmonyos
Lynnb19 小时前
Mac电脑烧录 RK3588 鸿蒙开发板固件教程
华为·harmonyos·鸿蒙系统
我头上有犄角ovo19 小时前
HarmonyOS 测肤拍照页实战:Metadata 实时取景 + Core Vision 拍后校验,从 0.001 的 widthRatio 踩坑到可上线
前端·harmonyos
码农小北20 小时前
MAC 配置鸿蒙(HarmonyOS) SDK 环境变量完整指南
macos·华为·harmonyos
weixin_3864689620 小时前
openharmony 6.0编译rk3568过程记录
c语言·c++·git·python·vim·harmonyos·openharmony