HarmonyOS 鸿蒙Next自定义组件实现controller的想法

发布于 1周前 作者 ionicwang 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next自定义组件实现controller的想法

原因

在分享完上篇帖子后,我翻阅文档发现官方提交的组件会有一个controller类来实现组件自定义方法的导出,于是我就顺着官方组件提供的代码实现了一个demo,欢迎大家指正留言。

上篇帖子的链接:https://developer.huawei.com/consumer/cn/forum/topic/0203135647591187191?fid=0102683795438680754

解决方案

老样子直接贴代码:

import test from './test'
[@Component](/user/Component)
struct Child {
 [@State](/user/State) private text: string = '初始值'
 private controller: ChildController

 aboutToAppear() {
   if(this.controller) {
     this.controller.changeText = this.changeText.bind(this)
   }
 }

 private changeText(value: string) {
   this.text = value
 }

 build() {
   Column() {
     Text(this.text)
   }
 }
}

class ChildController {
 changeText: (value: string) => void

}

export let ChildRef = new ChildController()

[@Entry](/user/Entry)
[@Component](/user/Component)
struct Parent {
 // ChildRef = new ChildController()
 [@State](/user/State) noShow: boolean = false

 build() {
   Column() {
     Text('获取Child的exposeMethods!').fontSize('18vp').fontColor(Color.Gray)
     Divider()
     Child({ controller: ChildRef })
     Child()
     Button('Parent调用childer的changeText').onClick(() => {
       ChildRef.changeText('Parent调用childer的changeText')
     })
     test()
   }
 }
}

6 回复
帮你试过了, api9 没问题,api10 有问题

我api10也不行

this.controller.changeText = (value: string) => this.changeText(value)

改成箭头函数就行

写完 说我 changeText 这个方法没有实现

在HarmonyOS 鸿蒙Next中,自定义组件实现controller的想法主要是通过创建一个中间的controller对象来实现父组件与子组件之间的间接通信。这种方法可以使得父组件能够调用子组件的方法,同时避免直接依赖子组件的内部实现,从而提高代码的可维护性和可扩展性。

具体实现时,首先需要在子组件中定义一个controller类,并在其中定义需要暴露给父组件调用的方法。然后,在子组件的初始化过程中(例如在aboutToAppear生命周期方法中),将子组件中实际实现的方法赋值给controller对象中的方法引用。

在父组件中,可以持有一个子组件controller对象的引用,并通过调用这个controller对象的方法来间接调用子组件的方法。这样,父组件就可以在不直接操作子组件控件的情况下,实现对子组件行为的控制。

此外,对于自定义的controller,还可以根据实际需求进行扩展,例如在controller中添加状态管理、事件处理等功能,以更好地支持复杂的业务逻辑。

需要注意的是,在实现过程中要确保controller对象的正确初始化和赋值,以及父子组件之间通信的顺畅。如果遇到问题,可以检查controller对象的定义和赋值是否正确,以及父子组件之间的引用关系是否清晰。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部