Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >鸿蒙开发:父组件如何调用子组件中的方法?

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

原创
作者头像
程序员一鸣
发布于 2025-03-25 11:21:18
发布于 2025-03-25 11:21:18
4080
举报

前言

本文基于Api13

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

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

代码语言:typescript
AI代码解释
复制
@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装饰器

代码语言:typescript
AI代码解释
复制
@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属性,不断的变化其值就可以了。

代码语言:typescript
AI代码解释
复制
@Entry
  @Component
  struct DemoPage {
    @State isChangeStatus: boolean = false

    build() {
      Column() {
        Child({ isChangeStatus: this.isChangeStatus })
        Button("点击")
          .onClick(() => {
            this.isChangeStatus = !this.isChangeStatus
          })
      }
      .height('100%')
        .width('100%')
        .justifyContent(FlexAlign.Center)
    }
  }

方式二:@Monitor装饰器

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

子组件定义@Monitor装饰器

代码语言:typescript
AI代码解释
复制
@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)
  }
}

父组件调用

代码语言:typescript
AI代码解释
复制
@Entry
@ComponentV2
struct DemoPage {
  @Local isChangeStatus: boolean = false

  build() {
    Column() {
      Child({ isChangeStatus: this.isChangeStatus })
      Button("点击")
        .onClick(() => {
          this.isChangeStatus = !this.isChangeStatus
        })
    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

方式三:接口回调

定义回调函数

代码语言:typescript
AI代码解释
复制
class ChangeController {
  change = () => {}
}

子组件实现回调

代码语言:typescript
AI代码解释
复制
@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)
  }
}

父组件调用函数

代码语言:typescript
AI代码解释
复制
@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

订阅事件

代码语言:typescript
AI代码解释
复制
@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)
  }
}

触发事件

代码语言:typescript
AI代码解释
复制
@Entry
@Component
struct DemoPage {
  build() {
    Column() {
      Child()
      Button("点击")
        .onClick(() => {
          getContext().eventHub.emit('changeUI')
        })
    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

相关总结

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
harmony OS NEXT-常用组件及其导航
骑老奶奶过马路
2025/03/30
2242
鸿蒙开发学习:动画
使用animation属性去定义动画的属性,需要注意的点是,如果在animation方法后定义的属性,在改变时将不会触发动画。
钟子翔
2024/12/24
810
鸿蒙开发:实现Popup气泡提示
气泡提示,在很多场景下都会用到,比如常见的微信会话聊天中,长按某一条消息,就会弹出一个气泡提示,或者点击右上角的加号,也会弹出一个气泡选择,可以说应用十分广泛。
程序员一鸣
2025/05/18
970
鸿蒙开发:实现Popup气泡提示
【OpenHarmony】OpenHarmony 开发基础 ③ ( @State 注解修饰变量 | Row 布局 | OpenHarmony 的 Length 属性值 | Column 布局 )
在上一篇博客 【OpenHarmony】OpenHarmony 开发基础 ② ( DevEco Studio 常用工具 | 参考文档 | 预览器 | 检查器 | 项目文件结构 | Index.ets 首界面 ) 中 , 分析了部分 index.ets 代码 的内容 ,
韩曙亮
2024/06/02
3530
【OpenHarmony】OpenHarmony 开发基础 ③ ( @State 注解修饰变量 | Row 布局 | OpenHarmony 的 Length 属性值 | Column 布局 )
鸿蒙-元服务-坚果派-第二章 页面与布局
这里将【Index.ets】的内容赋值到【SecondPage.ets】中,改一下结构体名称与message的字符串。
红目香薰
2025/02/19
1820
鸿蒙-元服务-坚果派-第二章 页面与布局
鸿蒙开发:了解@Builder装饰器
如果说一个页面中组件有很多,我们都统一写到build函数中,显而易见,会导致build函数代码非常冗余,并且在有相同UI时,也做不到可复用效果,那么,针对这一问题如何解决呢?答案就是抽取出来;在页面内实现UI组件的抽取剥离,其实,在实际的开发中是非常常见的,也就是通过@Builder装饰器来实现。
程序员一鸣
2025/02/15
1720
鸿蒙开发:了解@Builder装饰器
【愚公系列】2023年12月 HarmonyOS教学课程 016-ArkUI组件(Toggle)
Toggle组件是一个交互式UI组件,用于切换两种状态之间的选择或开关。它通常用于表示开关按钮,例如在设置中启用或禁用某些选项。
愚公搬代码
2025/06/02
670
【愚公系列】2023年12月 HarmonyOS教学课程 016-ArkUI组件(Toggle)
鸿蒙开发:事件订阅EventHub
有这样一个案例,页面A跳转到了页面B,页面B又跳转了页面C,在页面C中需要把数据回调至页面A,我们该如何去做?又或者,在一个模块中需要调用另一个模块中的方法,又该如何调用?在很多的场景下,我们都会想到回调的方式,如果层级较多呢?逐级回调能够解决,但是是十分的麻烦,为了解决这个问题,在鸿蒙当中提供了一个类似于EventBus的能力,它就是EventHub。
程序员一鸣
2025/03/29
2130
鸿蒙开发:事件订阅EventHub
鸿蒙开发:信息标记组件
信息标记,很是常见,比如手机桌面上的各种应用的右上角信息提示,微信的聊天中的消息未读提示等等,可以说非常常见。
程序员一鸣
2025/03/28
940
鸿蒙开发:信息标记组件
鸿蒙开发:自定义一个搜索模版
在之前的文章中,我们简单分析了弹性布局Flex,并使用Flex实现了一个简单的流式布局,今天这篇文章,我们就结合搜索框,完成一个常见的搜索页面,具体的效果如下图所示:
程序员一鸣
2025/03/13
790
鸿蒙开发:自定义一个搜索模版
鸿蒙开发:wrapBuilder传递参数
在前边的文章中,关于wrapBuilder传递参数我们有过概述,无论是定义在局部还是全局,传递参数都是非常的简单,直接调用builder函数即可,简单案例如下所示:
程序员一鸣
2025/03/10
1200
鸿蒙开发:wrapBuilder传递参数
鸿蒙开发:动态添加节点
做过Android的同学都知道,我们可以拿到任意一个容器组件,比如LinearLayout或者RelativeLayout,或者其他容器视图,我们都可以进行自由的添加子组件,方便我们去处理一些子元素动态变化的场景,然而由于鸿蒙的ArkUI是声明式的UI,我们无法拿到一个容器组件进行对其动态的添加。
程序员一鸣
2025/03/28
1250
鸿蒙开发:动态添加节点
HarmonyOS NEXT - 线性布局(Row和Column)
线性布局(LinearLayout)是开发中最常用的布局,通过线性容器Row和Column构建。线性布局是其他布局的基础,其子元素在线性方向上(水平方向和垂直方向)依次排列。线性布局的排列方向由所选容器组件决定,Column容器内子元素按照垂直方向排列,Row容器内子元素按照水平方向排列。根据不同的排列方向,开发者可选择使用Row或Column容器创建线性布局。
用户9936235
2025/03/31
880
鸿蒙开发:实现popup弹窗
popup弹窗,可以说是一个很常见的功能,像上边的微信,以及很多的应用,都会存在这样的需求,鸿蒙原生Api中,对于popup弹窗,可以说实现起来特别的简单,直接使用提供的
程序员一鸣
2024/12/26
2790
鸿蒙开发:实现popup弹窗
鸿蒙(HarmonyOS)应用性能优化实战-组件复用四板斧
在滑动场景下,常常会对同一类自定义组件的实例进行频繁的创建与销毁。此时可以考虑通过组件复用减少频繁创建与销毁的能耗。组件复用时,可能存在许多影响组件复用效率的操作,本篇文章将重点介绍如何通过组件复用四板斧提升复用性能。
小帅聊鸿蒙
2024/10/16
2170
鸿蒙(HarmonyOS)应用性能优化实战-组件复用四板斧
【愚公系列】2023年12月 HarmonyOS教学课程 035-ArkUI事件(触屏事件)
触屏事件是指通过触摸屏幕来进行操作和交互的事件。常见的触屏事件包括点击(tap)、双击(double tap)、长按(long press)、滑动(swipe)、拖动(drag)等。触屏事件通常用于移动设备和平板电脑等具有触摸屏幕的设备上,用户可以通过触摸屏幕上的不同区域或者以不同的方式进行操作,从而实现各种功能和交互效果。触屏事件可以被应用程序或者操作系统捕捉并响应,以实现用户与设备之间的交互。
愚公搬代码
2025/06/02
390
【愚公系列】2023年12月 HarmonyOS教学课程 035-ArkUI事件(触屏事件)
HarmonyOS NEXT父组件如何调用子组件的方法
可以定义一个controller类,在controller类中定义和子组件中类型相同的方法,在子组件中将实际封装的方法给到controller。父组件在使用时,new一个controller对象然后传入子组件,在父组件中调用controller对应的方法即可。
言程序
2024/12/27
4410
HarmonyOS NEXT父组件如何调用子组件的方法
ArkUI容器类组件-角标组件(Badge)
ArkUI 开发框架提供了 Badge 容器组件,它用来标记提示信息的容器组件,最常用的场景比如 Launcher 桌面上的消息提示等,本节笔者简单介绍一下 Badge 的使用。
小帅聊鸿蒙
2024/09/29
1440
ArkUI容器类组件-角标组件(Badge)
ArkUI容器类组件-线性布局容器(Row、Column)
线性容器类表示按照水平方向或者竖直方向排列子组件的容器,ArkUI开发框架通过 Row 和 Colum 来实现线性布局。
小帅聊鸿蒙
2024/09/27
2490
ArkUI容器类组件-线性布局容器(Row、Column)
【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发之常见布局
线性布局(LinearLayout)是开发中最常用的布局。线性布局的子组件在线性方向上(水平方向和垂直方向)依次排列。
枫叶丹
2025/01/20
3670
【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发之常见布局
推荐阅读
相关推荐
harmony OS NEXT-常用组件及其导航
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档