鸿蒙开发:父组件如何调用子组件中的方法?

ops/2025/3/29 16:42:25/

前言

本文基于Api13

很多的场景下,父组件需要触发子组件中的某个方法,来实现一些特定的逻辑,但是ArkUI是声明式UI,不能直接调用子组件中的方法,那么怎么去实现这个功能呢?

举一个很常见的案例,通过调用子组件中的某个方法,实现子组件UI的更新,简单的代码如下,只有通过调用changeUI方法,才会触发UI的更新。

@Component
struct Child {@State message: string = "我是子组件"/***AUTHOR:AbnerMing*INTRODUCE:子组件方法*/changeUI() {this.message = "子组件UI更新了"}build() {Text(this.message).width("100%").height(50).backgroundColor(Color.Pink).textAlign(TextAlign.Center)}
}

方式一:@Watch装饰器

如果你是用的V1版本装饰器,我们可以使用@Watch装饰器很轻松进行实现。

子组件定义@Watch装饰器

@Component
struct Child {@State message: string = "我是子组件"@Prop @Watch("changeUI") isChangeStatus: boolean = false/***AUTHOR:AbnerMing*INTRODUCE:子组件方法*/changeUI() {this.message = "子组件UI更新了"}build() {Text(this.message).width("100%").height(50).backgroundColor(Color.Pink).textAlign(TextAlign.Center)}
}

父组件调用

可通过子组件定义的isChangeStatus属性,不断的变化其值就可以了。

@Entry@Componentstruct DemoPage {@State isChangeStatus: boolean = falsebuild() {Column() {Child({ isChangeStatus: this.isChangeStatus })Button("点击").onClick(() => {this.isChangeStatus = !this.isChangeStatus})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}}

方式二:@Monitor装饰器

和方式一的实现方式是一致的,只不过,@Monitor装饰器是V2版本,也就是说,你使用的是V2版本装饰器的话,可以使用这个。

子组件定义@Monitor装饰器

@ComponentV2
struct Child {@Local message: string = "我是子组件"@Param isChangeStatus: boolean = false/***AUTHOR:AbnerMing*INTRODUCE:子组件方法*/@Monitor("isChangeStatus")changeUI() {this.message = "子组件UI更新了"}build() {Text(this.message).width("100%").height(50).backgroundColor(Color.Pink).textAlign(TextAlign.Center)}
}

父组件调用

@Entry
@ComponentV2
struct DemoPage {@Local isChangeStatus: boolean = falsebuild() {Column() {Child({ isChangeStatus: this.isChangeStatus })Button("点击").onClick(() => {this.isChangeStatus = !this.isChangeStatus})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

方式三:接口回调

定义回调函数

class ChangeController {change = () => {}
}

子组件实现回调

@Component
struct Child {@State message: string = "我是子组件"changeController: ChangeController = new ChangeController()aboutToAppear(): void {if (this.changeController.change != undefined) {this.changeController.change = () => {this.changeUI()}}}/***AUTHOR:AbnerMing*INTRODUCE:子组件方法*/changeUI() {this.message = "子组件UI更新了"}build() {Text(this.message).width("100%").height(50).backgroundColor(Color.Pink).textAlign(TextAlign.Center)}
}

父组件调用函数

@Entry
@Component
struct DemoPage {changeController: ChangeController = new ChangeController()build() {Column() {Child({ changeController: this.changeController })Button("点击").onClick(() => {this.changeController.change()})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

方式四:事件订阅EventHub

订阅事件

@Component
struct Child {@State message: string = "我是子组件"aboutToAppear(): void {getContext().eventHub.on("changeUI", ()=>{this.changeUI()})}/***AUTHOR:AbnerMing*INTRODUCE:子组件方法*/changeUI() {this.message = "子组件UI更新了"}build() {Text(this.message).width("100%").height(50).backgroundColor(Color.Pink).textAlign(TextAlign.Center)}
}

触发事件

@Entry
@Component
struct DemoPage {build() {Column() {Child()Button("点击").onClick(() => {getContext().eventHub.emit('changeUI')})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

相关总结

也许大家可能会有疑问,子组件更新UI,直接由装饰器触发不就行了,希望大家能够明白,以上呢只是简单的案例,在实际的开发中,子组件方法中可能很多的逻辑,比如网络请求,比如数据存储等等,并不是简单的UI更新。

当然了,所举的实现方式也不是全的,可能也有着其它的方式可以实现,大家在实际的开发中选择适合的一种即可。


http://www.ppmy.cn/ops/169936.html

相关文章

vscode 插件推荐

1、中文化插件 Chinese (Simplified) (简体中文) 2、中文标点符号转英文 中文标点符号转英文 3、标签补全 Auto Close Tag 4、git仓库信息查看 GitLens — Git supercharged 5、随机/顺序数据生成 Insert Sequences 6、html项目本地运行 Live Server 7、代码格式化 7.1、…

VMware打开ubuntu正在使用中怎么解决

1.如图1所示,打开ubuntu,出现该虚拟机正在使用中的情况; 图1 2.如图2所示,找到ubuntu文件夹下.lck的文件夹,删除它们即可; 图2 3.如图3所示,打开虚拟机正常,可以启动。 图3

物联网为什么用MQTT不用 HTTP 或 UDP?

先来两个代码对比,上传温度数据给服务器。 MQTT代码示例 // MQTT 客户端连接到 MQTT 服务器 mqttClient.connect("mqtt://broker.server.com:8883", clientId) // 订阅特定主题 mqttClient.subscribe("sensor/data", qos1) // …

万字C++STL——vector模拟实现

模拟实现总览 namespace wlw {//命名空间为了让其隔离//模拟实现vectortemplate<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;//默认成员函数vector(); //构造函数vector(size_t n, c…

【从零实现Json-Rpc框架】- 第三方库介绍 - Muduo篇

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

贪心算法——思路与例题

贪心算法&#xff1a;当我们分析一个问题时&#xff0c;我们往往先以最优的方式来解决问题&#xff0c;所以顾名思义为贪心。 例题1 题目分析&#xff1a;这题利用贪心算法来分析&#xff0c;最优解&#xff08;可容纳人数最多时&#xff09;一定是先考虑六人桌&#xff0c;然…

WELL健康建筑认证是什么?

**WELL健康建筑认证&#xff1a;全方位呵护居住者福祉的权威标准** WELL健康建筑认证&#xff0c;这一源自美国的全球性健康建筑标准&#xff0c;宛如建筑界的璀璨明珠&#xff0c;以其独特的光芒照亮了健康建筑的发展之路。它不仅是全球首部专门针对室内环境提升人体健康与福…

【大模型基础_毛玉仁】4.2 参数附加方法

目录 4.2 参数附加方法4.2.1 加在输入4.2.2 加在模型1&#xff09;Prefix-tuning&#xff08;前缀微调&#xff09;2&#xff09;Adapter-tuning&#xff08;适配器微调&#xff09;3&#xff09;AdapterFusion&#xff08;适配器融合&#xff09; 4.2.3 加在输出 4.2 参数附加…