HarmonyOS 鸿蒙Next struct页面和组件,无法继承或者混合,怎么去处理共有的属性和方法?
HarmonyOS 鸿蒙Next struct页面和组件,无法继承或者混合,怎么去处理共有的属性和方法?
那我们怎么去处理这些页面的公有的属性和方法,而不用在每个页面都去写一遍这些属性和方法?
两个子组件通过@Link关联,父组件用@State修饰的状态变量,再用@Watch监听状态变量变化,可以实现在组件b里调用组件a里的方法,但是@State修饰的变量变化会引起界面的刷新,可以参考如下demo:
@Entry
[@Component](/user/Component)
struct Index {
[@State](/user/State) msg: string = "组件消息"
build() {
Column() {
Text("page Index")
.fontSize(50)
.fontWeight(FontWeight.Bold)
ComponentA({ msg: this.msg })
ComponentB({ msg: this.msg })
}
}
}
[@Component](/user/Component)
export struct ComponentB {
[@Watch](/user/Watch)("changeData") [@Link](/user/Link) msg: string
changeData() {
console.log("ComponentB change")
}
build() {
Text(this.msg)
.fontSize(50)
.fontWeight(FontWeight.Bold)
}
}
[@Component](/user/Component)
export struct ComponentA {
[@Link](/user/Link) msg: string
build() {
Column() {
Text(this.msg).fontSize(50).fontWeight(FontWeight.Bold)
Button("ComponentB change").onClick(() => {
this.msg = "更新数据"
})
}
}
}
也可以定义一个类Mid,在类中定义方法midFunc,在父组件中new一个类的实例传入子组件a中,在a的aboutToAppear方法中将需要在其他组件中执行的方法赋值给mid.midFunc,然后在父组件中创建b组件的时候把b组件中的x方法重写为mid.midFunc(),这样在b中调用x方法时实际执行的是组件a中的方法。
请参考如下示例代码:
@Entry
[@Component](/user/Component)
struct Index {
[@State](/user/State) msg: string = "组件消息"
//midFunc:Function=()=>{console.log("qtw index midFunc")};
mid: Mid = new Mid();
build() {
Column() {
Text("page Index").fontSize(50).fontWeight(FontWeight.Bold)
ComponentB({ mid: this.mid })
ComponentA({
changeData: () => {
this.mid.midFunc()
}
})
}
}
}
[@Component](/user/Component)
export struct ComponentB {
[@State](/user/State) msg: string = '组件B';
//midFunc:Function=()=>{console.log("qtw ComponentB midFunc")};
mid: Mid = new Mid();
changeData: Function = () => {
this.msg = '变更B数据'
console.log("qtw ComponentB change")
}
aboutToAppear() {
console.log(`qtw constructor`)
this.mid.midFunc = this.changeData;
}
build() {
Text(this.msg).fontSize(50).fontWeight(FontWeight.Bold)
}
}
[@Component](/user/Component)
export struct ComponentA {
[@State](/user/State) msg: string = '组件A';
changeData: Function = () => {
this.msg = '变更A数据'
console.log("qtw ComponentA change")
}
build() {
Column() {
Text(this.msg).fontSize(50).fontWeight(FontWeight.Bold)
Button("A中的按钮").onClick(() => {
this.changeData();
})
}
}
}
class Mid {
midFunc: Function = () => {
};
}
@Component自定义组件是不支持继承的。建议把相关功能封装成一个组件,页面显示的内容使用@BuilderParam装饰器来显示,类似H5的slot插槽。
具体参考文档: https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkui-1-V5
更多关于HarmonyOS 鸿蒙Next struct页面和组件,无法继承或者混合,怎么去处理共有的属性和方法?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙开发中,面对Next struct页面和组件无法直接继承或混合的问题,处理共有属性和方法通常可以通过以下几种方式实现:
-
使用全局变量或单例模式:将共有属性和方法定义在一个全局可访问的地方,如全局变量或单例对象中。这样,无论是页面还是组件,都可以通过这些全局或单例对象来访问和修改共有属性,调用共有方法。
-
组合模式:虽然Next struct不支持继承,但可以通过将共有属性和方法封装在一个独立的struct中,然后在需要这些属性和方法的页面或组件中嵌入这个struct实例。这样,通过组合而非继承,也能达到共享代码的目的。
-
接口定义:定义接口(Protocol)来描述共有属性和方法,然后在需要实现这些功能的页面或组件中实现这些接口。这样,虽然页面和组件之间没有直接的继承关系,但通过接口实现了代码的复用和标准化。
以上方法各有优劣,具体选择哪种方式取决于你的项目需求和代码结构。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。