这篇文章介绍一个装饰器 @Styles

他的主要作用是: 当多个组件都有相同的样式,如果每个组件单独设置,会造成大量重复的代码冗余。这时我们可以使用 @Styles 将这些相同样式封装成一个方法,供这些组件调用,达到复用样式的目的

使用方法

@Styles 使用分为两种情况,在组件内使用 或 在全局使用。定义在组件内,作用域就是这个组件,定义在全局,作用域就是这个 .ets 文件

组件内使用

我们先看下面的一个例子,页面上画了两个方块,分别设置了宽、高、背景颜色等:

@Entry
@Component
struct Index {
build() {
Column() {
Text('方块1号')
.width('50%')
.height(100)
.margin({ top: 20 })
.backgroundColor('#ff04add7')
.fontSize(20)
.textAlign(TextAlign.Center)
Text('方块2号')
.width('50%')
.height(100)
.margin({ top: 20 })
.backgroundColor('#ff04add7')
.fontSize(20)
.textAlign(TextAlign.Center)
}
.width('100%')
}
}

在这个例子中,两个 Text 的宽、高样式都是一样的,可以使用 @Styles 将这些样式抽离,做成公共样式,如下:

@Entry
@Component
struct Index {
build() {
Column() {
Text('方块1号')
.TextStyle()
.fontSize(20)
.textAlign(TextAlign.Center)
Text('方块2号')
.TextStyle()
.fontSize(20)
.textAlign(TextAlign.Center)
}
.width('100%')
} @Styles
TextStyle() {
.width('50%')
.height(100)
.margin({ top: 20 })
.backgroundColor('#ff04add7')
}
}

注意事项: 通过阅读代码发现,类似 fontSizetextAlign等属性没有抽离出来,是因为 @Styles 仅支持

通用属性

fontSize 对文本组件有效,非文本组件,像Image组件就不需要该属性。TextAlign也是同理,不是所有组件都支持该属性

作用域: 在组件内定义的 @Styles 只能作用于当前组件

全局使用

@Styles 可以定义在组件内,也可以定义在全局。在全局定义需要加 Function 关键字,组件内定义不需要

@Entry
@Component
struct Index {
build(){
Column() {
Text('方块1')
.blockStyle()
.textAlign(TextAlign.Center)
.backgroundColor('#ff34e5df')
Text('方块2')
.blockStyle()
.textAlign(TextAlign.Center)
.backgroundColor('#ff3b77de')
Text('方块3')
.blockStyle()
.textAlign(TextAlign.Center)
.backgroundColor('#ff06f566')
}
.width('100%')
}
} @Styles function blockStyle(){
.width('30%')
.height(100)
}

作用域: 在全局定义的 @Styles 作用于整个 .ets 文件

使用 this

定义在组件内的 @Styles 可以通过 this 访问组件内的常量和状态变量,并可以在 @Styles 方法中通过事件来改变状态变量的值,如下:

@Entry
@Component
struct Index {
@State heightValue: number = 100 build() {
Text('方块')
.TextStyle()
.textAlign(TextAlign.Center)
} @Styles
TextStyle(){
.width('50%')
.height(this.heightValue)
.backgroundColor('#e1e1e1')
.onClick(() => {
this.heightValue = 200
})
}
}

效果如下:

注意事项:@Styles 中使用的事件,只支持

通用事件

不支持传参

总结

  1. @Styles 可以在组件内或全局进行定义,全局定义时需要在方法名前面添加 function 关键字,组件内定义则不需要
  2. 访问this:组件内的 @Styles 可以通过 this 访问组件的常量和状态变量,并可以在 @Styles 方法内部通过事件来改变状态变量的值
  3. 优先级:组件内的 @Styles 优先级高于 全局@Styles。框架优先找当前组件内的 @Styles,如果找不到,则会全局查找
  4. 作用域:组件内的 @Styles 只能在当前组件使用,全局的 @Styles 只能在当前 .ets 文件中使用,不支持 export

一些弊端:

  1. @Styles 中只支持通用属性通用事件
  2. @Styles 不支持传参
  3. 不支持跨文件使用

最后

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

鸿蒙页面开发 - 组件复用样式 @Styles的更多相关文章

  1. vue- Vue-Cli脚手架工具安装 -创建项目-页面开发流程-组件生命周期- -03

    目录 Vue-Cli 项目环境搭建 与 python 基础环境对比 环境搭建 创建启动 vue 项目 命令创建项目(步骤小多) 启动 vue 项目(命令行方式) 启动 vue 项目(pycharm 方 ...

  2. 从微信小程序到鸿蒙js开发【05】——tabs组件&每日新闻

    目录: 1.tabs, tab-bar, tab-content 2.tabs的事件处理 3.tabs实现的每日新闻 1.tabs, tab-bar, tab-content 上章说到,鸿蒙的list ...

  3. iOS开发 横向分页样式 可左右滑动或点击头部栏按钮进行页面切换

    iOS开发 横向分页样式 可左右滑动或点击头部栏按钮进行页面切换 不多说直接上效果图和代码 1.设置RootViewController为一个导航试图控制器 //  Copyright © 2016年 ...

  4. 从微信小程序到鸿蒙js开发【11】——页面路由

    目录: 1.router.push()&wx.navigateTo() 2.router.replace()&wx.redirectTo() 3.router.back()&w ...

  5. vue通过ID(参数)修改URL复用同一个页面(组件)不重新加载的问题

    项目中经常会用到同一个页面,结构是相同的,我只是在vue-router中通过添加参数的方式来区分状态,参数可以在页面跳转时带上params,或者query,但是有一个问题,即使我们修改了参数,URL也 ...

  6. 最全华为鸿蒙 HarmonyOS 开发资料汇总

    开发 本示例基于 OpenHarmony 下的 JavaScript UI 框架,进行项目目录解读,JS FA.常用和自定义组件.用户交互.JS 动画的实现,通过本示例可以基本了解和学习到 JavaS ...

  7. Svelte入门——Web Components实现跨框架组件复用

    Svelte 是构建 Web 应用程序的一种新方法,推出后一直不温不火,没有继Angular.React和VUE成为第四大框架,但也没有失去热度,无人问津.造成这种情况很重要的一个原因是,Svelte ...

  8. X5的UI部分和传统Web页面开发的差异

    http://doc.wex5.com/different-with-std-web-ui/#1 X5的UI部分和传统Web页面开发的差异 WeX5是跨端移动开发框架,BeX5是基于WeX5的企业快速 ...

  9. 记:Tmall活动页面开发

    一.年轻的我 “无人不成商”,如果一个电子商务网站想要做起来,搞活动时必不可少的(引入流量.提高用户黏度.活跃网站氛围),今天打折,明天送红包. (立秋活动,右) 作为一个前端,我当然要从技术的角度来 ...

  10. 【Android 应用开发】 ActionBar 样式详解 -- 样式 主题 简介 Actionbar 的 icon logo 标题 菜单样式修改

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/3926916 ...

随机推荐

  1. java——棋牌类游戏五子棋(webwzq1.0)之三(Msg)

    package msg; import java.io.ObjectInputStream; import java.net.DatagramSocket; /******************** ...

  2. 静态分析工具及使用总结(二)CheckStyle

    这里主要介绍三种开源的工具,PMD.CheckStyle和FindBugs,着重是在Ant里的调用,据说商业软件JTest也是著名的代码分析工具,哈哈,要花钱的没有用过. Checkstyle (ht ...

  3. golang之常用第三方包汇总

    汇总golang日常开发中常用的库包 [web] gin:  github.com/gin-gonic/gin [MySQL] gorm: [Redis] go-redis:  github.com/ ...

  4. solon 集成 kafka-clients

    使用 kafka-clients 原本是比较简单的事情.但有些同学习惯了 spring-kafka 后,对原始 java 接口会陌生些.会希望有个集成的示例. <dependency> & ...

  5. opencv+Linux源码编译安装及引用

    (一)下载 opencv下载地址:https://opencv.org/releases/ opencv_contrib下载地址:https://github.com/opencv/opencv_co ...

  6. 问题解决:Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist

    https://cloud.tencent.com/developer/article/1993317 大家都知道Centos8于2021年年底停止了服务,大家再在使用yum源安装时候,出现下面错误& ...

  7. Spring Validation 校验

    概述 在 Web 应用中,客户端提交数据之前都会进行数据的校验,比如用户注册时填写的邮箱地址是否符合规范.用户名长度的限制等等,不过这并不意味着服务端的代码可以免去数据验证的工作,用户也可能使用 HT ...

  8. Windows 记录开机后应用启动慢的问题

    最近大屏产品经常报一些开机启动的问题,工厂反馈厂测软件有些模块测试不通过,家里开发测试均发现Launcher等软件首次启动需要加载10多秒. 经过小伙伴们排查,发现是刷母盘后首次开机问题概率比较大.使 ...

  9. Qt项目架构经验总结

    (一)通用规则 除了极小的微型demo级别项目外,其余项目建议用pri分门别类不同文件夹存放代码文件,方便统一管理和查找. 同类型功能的类建议统一放在一起,如果该目录下代码文件数量过多,也建议拆分多个 ...

  10. 《Maven应用实战》一书的在线学习网址和源码链接

    <Maven应用实战>杨世文,孙会军 在线学习网址:http://c.biancheng.net/view/4756.html 源码链接:https://pan.baidu.com/s/1 ...