首页 > 其他分享 >HarmonyOS:@Extend装饰器:定义扩展组件样式

HarmonyOS:@Extend装饰器:定义扩展组件样式

时间:2024-12-16 16:58:26浏览次数:20  
标签:function Extend Color Text label HarmonyOS fontSize 组件

一、前言

使用@Styles用于样式的重用,在@Styles的基础上,使用@Extend扩展原生组件样式。

说明
从API version 9开始,该装饰器支持在ArkTS卡片中使用。

从API version 11开始,该装饰器支持在元服务中使用。

二、装饰器使用说明

语法

@Extend(UIComponentName) function functionName { ... }

三、使用规则

  • 和@Styles不同,@Extend支持封装指定组件的私有属性、私有事件和自身定义的全局方法。
// @Extend(Text)可以支持Text的私有属性fontColor
@Extend(Text) function fancy () {
  .fontColor(Color.Red)
}
// superFancyText可以调用预定义的fancy
@Extend(Text) function superFancyText(size:number) {
    .fontSize(size)
    .fancy()
}
  • 和@Styles不同,@Extend装饰的方法支持参数,开发者可以在调用时传递参数,调用遵循TS方法传值调用。
@Extend(Text)
function fancy2(size: number) {
  .fontColor(Color.White)
  .fontSize(size)
  .backgroundColor(Color.Blue)
}

@Component
struct FancyUse {
  build() {
    Column({ space: 16 }) {
      Text('superFancyText可以调用预定义的fancy')
        .superFancyText(14)
      Text('和@Styles不同,@Extend装饰的方法支持参数').fancy2(16)
    }
  }
}

效果图

在这里插入图片描述

  • @Extend装饰的方法的参数可以为function,作为Event事件的句柄。
import { promptAction } from '@kit.ArkUI'

@Extend(Text)
function makeMeClick(onClick: () => void) {
  .backgroundColor(Color.Pink)
  .onClick(onClick)
}

@Component
struct FancyUse {
  @State label: string = "@Extend装饰的方法的参数可以为function"

  onClickHand() {
    this.label = "执行了onClickHand"
  }

  build() {
    Column({ space: 16 }) {
      Text('@Extend装饰的方法的参数可以为function,作为Event事件的句柄').makeMeClick(() => {
        promptAction.showToast({ message: "执行了点击事件" })
      })

      Text(`${this.label}`).makeMeClick(() => {
        this.onClickHand()
      })
    }.margin({ top: 20 })
  }
}

效果图

在这里插入图片描述

  • @Extend的参数可以为状态变量,当状态变量改变时,UI可以正常的被刷新渲染。
@Extend(Text)
function fancy2(size: number) {
  .fontColor(Color.White)
  .fontSize(size)
  .backgroundColor(Color.Blue)
}

@Component
struct FancyUse {
  @State label: string = "@Extend装饰的方法的参数可以为function"
  @State fontSizeValue: number = 20

  onClickHand() {
    this.label = "执行了onClickHand"
  }

  build() {
    Column({ space: 16 }) {
      
      Text('和@Styles不同,@Extend装饰的方法支持参数')
        .fancy2(this.fontSizeValue)
        .onClick(() => {
          this.fontSizeValue = 16
        }
    }.margin({ top: 20 })
  }
}

效果图

在这里插入图片描述

在这里插入图片描述

四、限制条件

  • 和@Styles不同,@Extend仅支持在全局定义,不支持在组件内部定义

说明
只能在当前文件内使用,不支持export。

如果想实现export功能,推荐使用AttributeModifier

【反例】

@Entry
@Component
struct FancyUse {
  // 错误写法,@Extend仅支持在全局定义,不支持在组件内部定义
  @Extend(Text) function fancy (fontSize: number) {
    .fontSize(fontSize)
  }

  build() {
    Row({ space: 10 }) {
      Text('Fancy')
        .fancy(16)
    }
  }
}

【正例】

// 正确写法
@Extend(Text) function fancy (fontSize: number) {
  .fontSize(fontSize)
}

@Entry
@Component
struct FancyUse {

  build() {
    Row({ space: 10 }) {
      Text('Fancy')
        .fancy(16)
    }
  }
}

五、使用场景

以下示例声明了3个Text组件,每个Text组件均设置了fontStyle、fontWeight和backgroundColor样式。

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

  build() {
    Row({ space: 10 }) {
      Text(`${this.label}`)
        .fontStyle(FontStyle.Italic)
        .fontWeight(100)
        .backgroundColor(Color.Blue)
      Text(`${this.label}`)
        .fontStyle(FontStyle.Italic)
        .fontWeight(200)
        .backgroundColor(Color.Pink)
      Text(`${this.label}`)
        .fontStyle(FontStyle.Italic)
        .fontWeight(300)
        .backgroundColor(Color.Orange)
    }.margin('20%')
  }
}

@Extend将样式组合复用,示例如下。

@Extend(Text) function fancyText(weightValue: number, color: Color) {
  .fontStyle(FontStyle.Italic)
  .fontWeight(weightValue)
  .backgroundColor(color)
}

通过@Extend组合样式后,使得代码更加简洁,增强可读性。

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

  build() {
    Row({ space: 10 }) {
      Text(`${this.label}`)
        .fancyText(100, Color.Blue)
      Text(`${this.label}`)
        .fancyText(200, Color.Pink)
      Text(`${this.label}`)
        .fancyText(300, Color.Orange)
    }.margin('20%')
  }
}

效果图

在这里插入图片描述

六、推荐

点击查看 HarmonyOS:@Styles装饰器:定义组件重用样式

标签:function,Extend,Color,Text,label,HarmonyOS,fontSize,组件
From: https://blog.csdn.net/ChinaDragon10/article/details/144483858

相关文章

  • SpringCloud微服务实战系列:05远程调用组件Feign的核心原理
    目录代码解释:Feign对象创建核心原理:总结:演示完整代码:写过springcloud微服务的都知道feign远程调用,为了方便演示,我们换一种写法,直接在main方法中运行:代码解释:1.定义请求拦截器:requestTemplate.header("authorization","Bearer69a5d08839dc4cfcab3daf20635acbe6");......
  • 常用UI组件库
    https://www.iviewui.com1.**ElementPlus**-官方网站:https://element-plus.org/-ElementPlus是由ElementUI升级而来的一个基于Vue3的桌面端组件库,拥有完整的组件体系,适合中后台产品的开发。2.**AntDesignofVue**-官方网站:https://2x.antdv.com/do......
  • 华为HarmonyOS实现跨多个子系统融合的场景化服务 -- 3 打开授权设置页Button
    场景介绍本章节将向您介绍如何使用Button组件打开授权设置页功能,开发者可调用对应Button组件跳转到应用对应的权限设置页面,供用户快速进行应用权限的查看和修改。效果图展示单击“打开授权设置页”按钮,跳转至应用对应的设置页界面。开发步骤导入ScenarioFusionKit模块......
  • uniapp 应用的生命周期、页面的生命周期、组件的生命周期
    uniapp作为一款跨平台的移动应用开发框架,其生命周期分为应用生命周期、页面生命周期和组件生命周期。下面分别介绍这三种生命周期的具体内容:应用生命周期应用生命周期仅适用于整个应用,在 App.vue 中可以监听到以下生命周期函数:onLaunch:当应用启动完成时触发,全局只触发一......
  • HarmonyOS Next 入门实战 - 文字转拼音,文字转语音
    文字转拼音安装pinyin4js三方库ohpminstall@ohos/pinyin4jspinyin4js提供了以下接口:●文字转拼音(带声调和不带声调)●文字转拼音首字母●简体繁体互转letrawText="风急天高猿萧哀,渚清沙白鸟飞回;"letpinyin1:string=pinyin4js.convertToPinyinString(rawT......
  • HarmonyOS Next分布式智能家居控制系统实战
    本文旨在深入探讨基于华为鸿蒙HarmonyOSNext系统(截止目前API12)构建分布式智能家居控制系统的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、项......
  • HarmonyOS Next 设备适配与生态拓展
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在设备适配与生态拓展方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、设备适配......
  • HarmonyOS Next 应用性能优化实战
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)中应用性能优化的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、性能评估指标与工具......
  • 【开源系列】JustAuth:小而全而美的第三方登录开源组件
    推荐阅读:《专为智能无人系统打造的边缘实时感知SDK库!-SpireCV》我们在企业开发中,常常需要实现登录功能,而有时候为了方便,就需要集成第三方平台的授权登录。如常见的微信登录、微博登录等,免去了用户注册步骤,提高了用户体验。为了业务考虑,我们有时候集成的不仅仅是一两个第三方......
  • HarmonyOS Next 中的 HAP、HAR、HSP 区别
    HarmonyOSNext中的HAP、HAR、HSP区别想要更加合理的开发一个企业级别的Harmony应用,那么就不得不提其中的HAP、HAR、HSP了。前言对于普通的用户来说,可能一个普通的应用就等于一个安装文件如安卓下的APK。但是对于Harmony应用开发工程师来讲,一个应用包含的内容仅仅不止......