HarmonyOS 鸿蒙Next 公共UI逻辑方法抽象

HarmonyOS 鸿蒙Next 公共UI逻辑方法抽象 在项目开发中,需要类似BaseActivity这种开发一些逻辑,但是struct不能继承,是否可以通过其他方式实现这个目的?是否可以页面部分可以抽象成自定义子组件或者全局Builder,在需要使用的页面引入方法或UI。

请给出一些详细的代码参考

2 回复

参考demo:

1、两个子组件通过@Link关联父组件用@State修饰的状态变量,再用@Watch监听状态变量变化,可以实现在组件b里调用组件a里的方法,但是@State修饰的变量变化会引起界面的刷新,请参考如下demo

@Entry
@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
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
export struct ComponentA {
  [@Link](/user/Link) msg: string
  build() {
    Column() {
      Text(this.msg).fontSize(50).fontWeight(FontWeight.Bold)
      Button("ComponentB change").onClick(() => {
        this.msg = "更新数据"
      })
    }
  }
}

2、也可以定义一个类Mid,在类中定义方法midFunc,在父组件中new一个类的实例传入子组件a中,在a的aboutToAppear方法中将需要在其他组件中执行的方法赋值给mid.midFunc,然后在父组件中创建b组件的时候把b组件中的x方法重写为mid.midFunc(),这样在b中调用x方法时实际执行的是组件a中的方法。

请参考如下示例代码:

@Entry
@Component
struct Index {
  [@State](/user/State) msg: string = "组件消息"
  //midFunc:Function=()=>"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
export struct ComponentB {
  [@State](/user/State) msg:string='组件B';
  //midFunc:Function=()=>"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
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=(){};
}

更多关于HarmonyOS 鸿蒙Next 公共UI逻辑方法抽象的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,进行公共UI逻辑方法抽象是提升代码复用性和维护性的重要手段。以下是关于如何在HarmonyOS中实现公共UI逻辑方法抽象的一些要点:

  1. 定义抽象类或接口: 在鸿蒙的ETS(Enhanced TypeScript)语言中,你可以定义一个抽象类或接口来声明公共的UI逻辑方法。这些方法不包含具体实现,而是由子类或实现类来提供。

  2. 实现抽象类或接口: 创建具体的UI组件类,并让它们继承抽象类或实现接口。在这些子类中,实现抽象方法,提供具体的UI逻辑。

  3. 使用组合而非继承: 如果继承关系过于复杂,可以考虑使用组合模式。即,将公共的UI逻辑封装在一个独立的类中,然后在需要的地方实例化这个类并调用其方法。

  4. 利用ETS的装饰器: ETS支持装饰器,可以用来标记或修改类、方法或属性的行为。你可以利用装饰器来自动化一些公共UI逻辑的处理。

  5. 模块化设计: 将公共的UI逻辑封装成模块,这样可以在不同的项目中复用这些模块,减少重复代码。

请注意,以上内容是基于HarmonyOS的ETS语言进行描述的。如果你的项目中使用了其他编程语言或框架,请根据实际情况进行调整。

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

回到顶部