鸿蒙开发 - 自定义组件 和 组件通信的方法

news/2025/1/14 11:10:13/文章来源:https://www.cnblogs.com/naturl/p/18668909

自定义组件的基本结构

@Entry
@Component
struct MyComponent {build(){// ...}
}
  • build()函数

build()函数用于描述组件的UI界面,自定义组件必须定义build()函数

build() {Column() {Text('测试')Button('点击')}
}
  • struct 关键字

strcut 用来声明数据结构 struct + 自定组件名 + { ... }

struct@Component 装饰后,必须要要有 build() 函数

struct MyComponent {
}
  • @Component 装饰器

@Component 用来声明一个组件

  1. @Componentstruct 两者配对使用
  2. @Component只能装饰 struct 关键字声明的数据结构
@Component 
struct MyComponent {build() {}
}
  • @Entry 装饰器

使用 @Entry 用于标记一个页面的入口点。当用户打开应用或导航路由的时候,展示的就是这个组件

@Entry
@Component
struct MyComponent {build() {}
}

组件通信

父子间单向传递 @Prop

@Prop 单向传递数据:父组件数据变化,会通知子组件,但子组件数据变化,不会通知父组件

  1. 子组件深拷贝父组件传过来的数据,父组件发生数据变更,子组件会跟着变化
  2. 子组件也可以自己更新数据,但不会同步父组件数据

举例:父组件向子组件传递一个数据 text,默认值是 123,当点击按钮的时候,更新 text 的值为 456

  • 父组件
import Child from './Child'@Entry
@Component
struct Parent {@State text: string = '123'build() {Column() {Button(`按钮:${this.text}`).onClick(() => {this.text = '456'})Child({ text: this.text })}}
}
  • 子组件

子组件使用 @Prop 装饰器进行修饰变量

@Component
export default struct Child {@Prop text: string = ''build() {Row() {Text(`父组件传过来的内容:${this.text}`)}}
}

按钮点击前:

img.png

按钮点击后:

img_1.png

需要注意的是: 当父组件发生数据变更,子组件如果想跟着改变,就需要使用 @Prop 声明变量 @Prop text:string = ''。当然如果不需要跟着改变,也可以直接这么写 text:string = '',相当于将text的初始值传过去了,后续不会跟着变化

@Link 双向传递数据:父组件发生数据变化,会通知子组件,同时子组件数据变化,也通知父组件


使用 @Link,替换掉 @Prop,即 @Link text:string

需要注意的是: 使用 @Link 修饰的变量,不需要进行初始化,也就是不需要附一个初始值

// 子组件@Component
export default struct Child {@Link text: stringbuild() {Column() {Text(`父组件传过来的内容:${this.text}`)Button('更改父组件传过来的数据').onClick(() => {this.text = '789'})}}
}

当子组件点了更改数据的按钮,父组件也跟着发生了变化,效果图如下,

img_2.png

子组件调用父组件的方法

和传数据类似,只不过现在传递一个函数方法

  • 父组件

父组件定义一个方法 click, 传给子组件

import Child from './Child'@Entry
@Component
struct Parent {@State count: number = 0click: () => void = () => {this.count++}build() {Column() {Text(`点击次数:${this.count}`)Child({ parentClick: this.click })}}
}
  • 子组件

子组件声明父组件传过来的 parentClick 函数,调用即可

@Component
export default struct Child {parentClick?: () => voidbuild() {Column() {Button('点击').onClick(() => {if (this.parentClick) {this.parentClick()}})}}
}

初始化效果图:

img_3.png

子组件调用父组件方法后:

img_4.png

跨组件双向通信(@Provide 和 @Consume)

使用@Provide@Consume 实现跨组件通信,这种方式是双向的,不管祖先组件还是后代组件发生数据变更,另外一方都会实时变化

祖先组件使用 @Provide 注入数据

@Provide text: string = '123'

后代组件使用 @Consume 接收

@Consume text: string

注意: @Consume 同样不需要初始化

eventHub 事件总线

eventHub 提供了事件中心,提供了监听事件和触发事件的能力,从而实现跨组件通信。(很接近vue的eventBus)

  • 祖先组件
@Entry
@Component
struct Parent{build() {Column() {Button('发送').onClick(() => {getContext(this).eventHub.emit('init', 2)})}}
}
  • 后代组件

后代组件中,先建立起监听事件,

@Component
export default struct Grandchild {@State value: number = 1aboutToAppear(): void {getContext(this).eventHub.on('init', (data: number) => {this.handleMessage(data)})}handleMessage(value: number) {this.value = value}build() {Text(`接收到父组件发送的数据:${this.value}`)}
}
方法
  • on(event: string, callback: Function) 监听事件
  • emit(event: string, ...args: Object[]) 触发事件
  • off(event: string, callback?: Function) 取消订阅的指定事件
    • 传入 callback:取消指定的 callback 对指定事件的订阅,当该事件触发后,将不会再回调该callback。
    • 不传 callback:取消所有 callback 对指定事件的订阅。

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

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

相关文章

RN/H5多设备自适应组件库来了,高效实现鸿蒙原生应用多设备精致体验

在原生鸿蒙应用开发中,华为针对ArkUI框架推出了一整套针对多设备适配的完善能力(如“一多”能力)以及高阶组件(如分栏、边看边评等),帮助开发者轻松实现“一次开发,多端部署”。然而,当前鸿蒙生态仍存在大量用跨平台框架开发的应用,部分页面采用React Native(RN)和H…

abb焊接机器人在运行过程中所遇到的问题及解决办法

一、硬件故障电气元件故障故障表现:如继电器、开关、熔断器等失效,可能是由于这些元器件的质量、性能与工作环境等因素引起的。 解决方法:对失效或破损的元器件进行维修或更换。 线路故障故障表现:长时间工作运动可能导致连接abb机器人本体的电缆或电线发生疲劳破损。 解…

Win10上用Qemu安装LoongArch版的Deepin系统

我前面有一篇贴子写了使用Loongnix搭建开发环境(https://www.cnblogs.com/airscrat/p/17142185.html),使用的虚拟机是直接下载的龙芯团队预装的,贴子并未介绍怎么用iso镜像文件安装虚拟机系统。当前Deepin loong64 v23版本已经发布,界面也漂亮,下面就一步一步的从iso安装…

Avalonia银河麒麟系统软件运行环境安装

软件运行需要安装.NET 6.0。 安装方式如下: 电脑桌面鼠标右击“打开终端” ,输入“dotnet --version ”,查看电脑是否有.net 6.0。图1_打开终端窗口示意图 在线安装方法:(.net6.0 安装方法二选一即可) 如果没有.NET 6.0 ,将电脑连接外网,鼠标右击“打开终端”,输入下面…

安川并联机器人维修步骤讲解

一、安川机器人维修步骤 1、断电与拆卸: 确保电机处于断电状态,以避免触电危险。 拆卸YASKAWA蜘蛛手机械臂电机外壳,以便检查内部零部件。 2、内部检查: 检查内部结构是否正常,零部件是否有损坏。 对损坏的零部件进行更换,清洗内部的灰尘和杂物。 3、故障诊断: 根据…

深入解析 Spring AI 系列:解析OpenAI接口对接

今天我们将主要探讨OpenAI是如何进行接口对接的,虽然我们不打算深入细节,但会对整体流程进行一个大概的了解。后续会逐步分析其中的具体细节,大家可以耐心等待,逐步展开。好的,现在让我们开始,下面是我简单绘制的一张图示,旨在帮助大家更好地理解接下来的分析流程。Open…

赛果公布!有灵AOP平台首届编程挑战赛圆满落幕

近日,网易伏羲有灵AOP平台首届编程挑战赛顺利落下帷幕。自赛事启动以来,在短短几周的时间里,来自各地的优秀开发者们汇集于此,通过人机协作的形式,完成了多项充满创意和技术深度的任务。此次挑战赛不仅展现了参赛者的卓越编程技能,也体现了AOP(Agent Oriented Programmi…

华大HC32F4A0串口使用及printf重定向

说明: 轮询 polling方法 更改自小华HC32官方库DDL_2.2.0版本相关宏定义 /* 串口 */ #define USART_RX_PORT (GPIO_PORT_B) /* PH13: USART1_RX */ #define USART_RX_PIN (GPIO_PIN_15) #define USART_RX_GPIO_FUNC (GPIO…

HC32F4A0串口使用

说明: 轮询 polling方法 更改自HC32官方库2.2.0版本相关宏定义 /* 串口 */ #define USART_RX_PORT (GPIO_PORT_B) /* PH13: USART1_RX */ #define USART_RX_PIN (GPIO_PIN_15) #define USART_RX_GPIO_FUNC (GPIO_FUNC_33…

读量子霸权03量子的崛起

瑞利-金斯灾变揭示牛顿力学漏洞,普朗克提出量子理论颠覆传统。爱因斯坦解释光电效应,薛定谔方程成量子基石。量子纠缠等理论展现量子世界奇妙,量子计算机应运而生。1. 瑞利-金斯灾变 1.1. 也被称为紫外灾变1.1.1. 在高频条件下发射的能量应该是无限大的,而这在现实中是根本…

宠物经济与即时零售:如何把握双赢机遇?

借助板栗看板,宠物食品和用品的即时零售模式可以实现从营销目标设定、库存管理、营销活动规划、顾客互动到数据分析与反馈的全链条优化。这不仅能够提升运营效率,还能增强品牌影响力,提升顾客满意度和忠诚度。宠物即时零售是近年来随着宠物经济的蓬勃发展和即时零售模式的兴…

manim边做边学--动画联动

今天介绍Manim中的动画联动的技巧,在数学动画中,动画联动是常用的功能, 比如讲解平面几何中三角形与圆的位置关系变化,通过动画联动可以让圆沿着三角形的边滚动,或者让三角形的顶点在圆上移动,从而直观地展示内切、外接等几何关系。 总之,通过动画联动,可以将复杂的概念…