鸿蒙页面开发 - 扩展组件样式 @Extend

这篇文章介绍一个装饰器 @Extend,它的主要作用是:用于扩展原生组件的样式

比如我们扩展 Text 组件的样式,为其添加一个默认的 fontSizefontColor,如下:

typescript 复制代码
@Entry
@Component
struct Index {
  build() {
    Text('碧玉妆成一树高,万条垂下绿丝绦。')
      .TextExtend()
  }
}

@Extend(Text)
function TextExtend() {
  .fontSize(20)
  .fontColor(Color.Blue)
}

通过上面的代码,我们就为 Text 组件扩展了一些样式,让其拥有了默认的字体大小和字体颜色

效果如下:

因为@Extend是作用于单个组件,所以也支持组件的所有属性和事件(包括组件的私有属性),这点和 @Styles 不同

并且他 只能在全局定义,不支持组件内部定义

@Extend支持传参(@Styles不支持)

typescript 复制代码
@Entry
@Component
struct Index {
  build() {
    Text('碧玉妆成一树高,万条垂下绿丝绦。')
      .TextExtend(22)
  }
}

@Extend(Text)
function TextExtend(fontSize: number) {
  .fontSize(fontSize)
  .fontColor(Color.Blue)
} 

@Extend传的参数,支持传入状态变量,当变量改变时,UI也会重新渲染

typescript 复制代码
@Entry
@Component
struct Index {
  @State fontSize: number = 16

  build() {
    Text('碧玉妆成一树高,万条垂下绿丝绦。')
      .TextExtend(this.fontSize)
      .onClick(() => {
        this.fontSize = 24
      })
  }
}

@Extend(Text)
function TextExtend(fontSize: number) {
  .fontSize(fontSize)
  .fontColor(Color.Blue)
} 

效果如下:

@Extend支持调用其他方法,继承其他方法的属性

比如在 TextExtend_1 中定义字体的大小、颜色。在 TextExtend_2 定义背景颜色,并且在 TextExtend_2 中调用 TextExtend_1 方法

typescript 复制代码
@Entry
@Component
struct Index {
  build() {
    Text('碧玉妆成一树高,万条垂下绿丝绦。')
      .TextExtend_2()
  }
}

@Extend(Text)
function TextExtend_1() {
  .fontSize(20)
  .fontColor(Color.Blue)
}

@Extend(Text)
function TextExtend_2() {
  .backgroundColor(Color.Gray)
  .TextExtend_1()
}

@Extend装饰的方法,参数可以为function,作为Event事件的句柄。

typescript 复制代码
@Extend(Text) function makeMeClick(onClick: () => void) {
   .backgroundColor(Color.Blue)
   .onClick(onClick)
}

@Entry
@Component
struct FancyUse {
   @State label: string = 'Hello World';

   onClickHandler() {
      this.label = 'Hello ArkUI';
   }
   
   build() {
      Row({ space: 10 }) {
         Text(`${this.label}`)
            .makeMeClick(() => {this.onClickHandler()})
      }
   }
}

总结

  1. @Extend 支持组件的私有属性和私有方法。并且只能在全局定义,不支持组件内部定义 (@Styles只支持通用属性和通用方法,可以在全局定义,也可以在组件内定义)
  2. @Extend 支持传参,也可以传入状态变量,当变量改变的时候,UI也会重新渲染(@Style不支持传参)

最后

如果大家有不理解的地方可以留言,或自行阅读文档 文档地址

相关推荐
一叶难遮天17 天前
快速入门HarmonyOS应用开发(一)
harmonyos·arkts·arkui·navigation·鸿蒙开发·鸿蒙5.0
User_芊芊君子24 天前
【成长纪实】我的鸿蒙成长之路:从“小白”到独立开发,带你走进鸿蒙的世界
学习·华为·harmonyos·鸿蒙开发
●VON24 天前
【成长纪实】三个月的鸿蒙成长之路:大学生从0开始的鸿蒙心得与体会
华为·架构·harmonyos·鸿蒙·鸿蒙系统·鸿蒙开发·成长纪实
摘星编程1 个月前
【成长纪实】HarmonyOS Next学习地图:新手避坑指南与核心知识点拆解
学习·华为·harmonyos·鸿蒙开发
摘星编程1 个月前
【参赛心得】HarmonyOS创新赛获奖秘籍:如何用Stage模型和声明式UI打造高分作品
ui·华为·harmonyos·鸿蒙开发·stage模型
开发小能手嗨啊3 个月前
鸿蒙开发进阶(HarmonyOS)
harmonyos·鸿蒙·鸿蒙开发·开发教程·纯血鸿蒙·南向开发·北向开发
开发小能手嗨啊3 个月前
「鸿蒙系统的编程基础」——探索鸿蒙开发
harmonyos·鸿蒙·鸿蒙开发·开发教程·纯血鸿蒙·南向开发·北向开发
8931519603 个月前
TypeScript 泛型
typescript·鸿蒙开发·鸿蒙教程·鸿蒙泛型
AIGC魔法师7 个月前
轮播图导航组件 | 纯血鸿蒙组件库AUI
开发语言·harmonyos·openharmony·鸿蒙开发·纯血鸿蒙·arkui / ets·鸿蒙组件库aui
川石教育7 个月前
鸿蒙开发之嵌套对象更新
harmonyos·鸿蒙开发·鸿蒙开发培训·鸿蒙开发教程·鸿蒙培训课程