HarmonyOS 鸿蒙Next struct页面和组件,无法继承或者混合,怎么去处理共有的属性和方法?

发布于 1周前 作者 songsunli 来自 鸿蒙OS

HarmonyOS 鸿蒙Next struct页面和组件,无法继承或者混合,怎么去处理共有的属性和方法?

我们在做页面和组件的封装的时候,希望像其他语言一样,让app的所有页面继承或者混合于一个基类,这样可以统一设置一些属性和方法。在鸿蒙里面,页面布局struct,好像不能集成或者混合。
那我们怎么去处理这些页面的公有的属性和方法,而不用在每个页面都去写一遍这些属性和方法?
 
 

3 回复

两个子组件通过@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


用组合的方式。把公共不服提取成一个Componet。

在HarmonyOS鸿蒙开发中,面对Next struct页面和组件无法直接继承或混合的问题,处理共有属性和方法通常可以通过以下几种方式实现:

  1. 使用全局变量或单例模式:将共有属性和方法定义在一个全局可访问的地方,如全局变量或单例对象中。这样,无论是页面还是组件,都可以通过这些全局或单例对象来访问和修改共有属性,调用共有方法。

  2. 组合模式:虽然Next struct不支持继承,但可以通过将共有属性和方法封装在一个独立的struct中,然后在需要这些属性和方法的页面或组件中嵌入这个struct实例。这样,通过组合而非继承,也能达到共享代码的目的。

  3. 接口定义:定义接口(Protocol)来描述共有属性和方法,然后在需要实现这些功能的页面或组件中实现这些接口。这样,虽然页面和组件之间没有直接的继承关系,但通过接口实现了代码的复用和标准化。

以上方法各有优劣,具体选择哪种方式取决于你的项目需求和代码结构。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部