HarmonyOS 鸿蒙Next自定义组件实现controller的想法
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()
}
}
}
我api10也不行
this.controller.changeText = (value: string) => this.changeText(value)
改成箭头函数就行
在HarmonyOS 鸿蒙Next中,自定义组件实现controller的想法主要是通过创建一个中间的controller对象来实现父组件与子组件之间的间接通信。这种方法可以使得父组件能够调用子组件的方法,同时避免直接依赖子组件的内部实现,从而提高代码的可维护性和可扩展性。
具体实现时,首先需要在子组件中定义一个controller类,并在其中定义需要暴露给父组件调用的方法。然后,在子组件的初始化过程中(例如在aboutToAppear生命周期方法中),将子组件中实际实现的方法赋值给controller对象中的方法引用。
在父组件中,可以持有一个子组件controller对象的引用,并通过调用这个controller对象的方法来间接调用子组件的方法。这样,父组件就可以在不直接操作子组件控件的情况下,实现对子组件行为的控制。
此外,对于自定义的controller,还可以根据实际需求进行扩展,例如在controller中添加状态管理、事件处理等功能,以更好地支持复杂的业务逻辑。
需要注意的是,在实现过程中要确保controller对象的正确初始化和赋值,以及父子组件之间通信的顺畅。如果遇到问题,可以检查controller对象的定义和赋值是否正确,以及父子组件之间的引用关系是否清晰。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。