鸿蒙页面开发 - 组件复用样式 @Styles
这篇文章介绍一个装饰器 @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')
}
}
注意事项: 通过阅读代码发现,类似 fontSize、textAlign等属性没有抽离出来,是因为 @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 中使用的事件,只支持
通用事件
不支持传参

总结
@Styles可以在组件内或全局进行定义,全局定义时需要在方法名前面添加function关键字,组件内定义则不需要- 访问this:组件内的
@Styles可以通过this访问组件的常量和状态变量,并可以在@Styles方法内部通过事件来改变状态变量的值 - 优先级:组件内的
@Styles优先级高于 全局@Styles。框架优先找当前组件内的@Styles,如果找不到,则会全局查找 - 作用域:组件内的
@Styles只能在当前组件使用,全局的@Styles只能在当前.ets文件中使用,不支持export
一些弊端:
最后
如果大家有不理解的地方可以留言,或自行阅读文档 文档地址
鸿蒙页面开发 - 组件复用样式 @Styles的更多相关文章
- vue- Vue-Cli脚手架工具安装 -创建项目-页面开发流程-组件生命周期- -03
目录 Vue-Cli 项目环境搭建 与 python 基础环境对比 环境搭建 创建启动 vue 项目 命令创建项目(步骤小多) 启动 vue 项目(命令行方式) 启动 vue 项目(pycharm 方 ...
- 从微信小程序到鸿蒙js开发【05】——tabs组件&每日新闻
目录: 1.tabs, tab-bar, tab-content 2.tabs的事件处理 3.tabs实现的每日新闻 1.tabs, tab-bar, tab-content 上章说到,鸿蒙的list ...
- iOS开发 横向分页样式 可左右滑动或点击头部栏按钮进行页面切换
iOS开发 横向分页样式 可左右滑动或点击头部栏按钮进行页面切换 不多说直接上效果图和代码 1.设置RootViewController为一个导航试图控制器 // Copyright © 2016年 ...
- 从微信小程序到鸿蒙js开发【11】——页面路由
目录: 1.router.push()&wx.navigateTo() 2.router.replace()&wx.redirectTo() 3.router.back()&w ...
- vue通过ID(参数)修改URL复用同一个页面(组件)不重新加载的问题
项目中经常会用到同一个页面,结构是相同的,我只是在vue-router中通过添加参数的方式来区分状态,参数可以在页面跳转时带上params,或者query,但是有一个问题,即使我们修改了参数,URL也 ...
- 最全华为鸿蒙 HarmonyOS 开发资料汇总
开发 本示例基于 OpenHarmony 下的 JavaScript UI 框架,进行项目目录解读,JS FA.常用和自定义组件.用户交互.JS 动画的实现,通过本示例可以基本了解和学习到 JavaS ...
- Svelte入门——Web Components实现跨框架组件复用
Svelte 是构建 Web 应用程序的一种新方法,推出后一直不温不火,没有继Angular.React和VUE成为第四大框架,但也没有失去热度,无人问津.造成这种情况很重要的一个原因是,Svelte ...
- X5的UI部分和传统Web页面开发的差异
http://doc.wex5.com/different-with-std-web-ui/#1 X5的UI部分和传统Web页面开发的差异 WeX5是跨端移动开发框架,BeX5是基于WeX5的企业快速 ...
- 记:Tmall活动页面开发
一.年轻的我 “无人不成商”,如果一个电子商务网站想要做起来,搞活动时必不可少的(引入流量.提高用户黏度.活跃网站氛围),今天打折,明天送红包. (立秋活动,右) 作为一个前端,我当然要从技术的角度来 ...
- 【Android 应用开发】 ActionBar 样式详解 -- 样式 主题 简介 Actionbar 的 icon logo 标题 菜单样式修改
作者 : 万境绝尘 (octopus_truth@163.com) 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/3926916 ...
随机推荐
- btrace一些你不知道的事(源码入手)
背景 周五下班回家,在公司班车上觉得无聊,看了下btrace的源码(自己反编译). 一些关于btrace的基本内容,可以看下我早起的一篇记录:btrace记忆 上一篇主要介绍的是btrace的一些基本 ...
- Java深度历险(八)——Java I/O
在应用程序中,通常会涉及到两种类型的计算:CPU计算和I/O计算.对于大多数应用来说,花费在等待I/O上的时间是占较大比重的.通常需要等待速度较慢的磁盘或是网络连接完成I/O请求,才能继续后面的CPU ...
- Linux常用系统性能监控工具
top 首先关于top命令,我想大家应该都挺熟悉的了. Linux系统下的top命令有点类似于Windows系统里的任务管理器,能够实时动态地给出系统中各个进程的资源占用状况,是Linux下比较常用的 ...
- docker 批量删除镜像
删除虚悬镜像 列出REPOSITORY和TAG均为<none>的虚悬镜像: $ docker images --filter dangling=true REPOSITORY TAG IM ...
- VTK 视角的旋转、平移、缩放
在CAD/CAM软件中,都需要旋转.平移和缩放视角,来观察操作图形.由于VTK定义的交互的类型不是很适用,所有通过定义一套自己的交互方式. 在下面代码中,鼠标左键平移,滚轮缩放,右键旋转. 先定义一个 ...
- 【异或运算】codeforces 1153 B. Dima and a Bad XOR
前言 异或运算:是一种在二进制数系统中使用的逻辑运算.它的基本规则是对两个二进制位进行比较,如果这两个位不同,则结果为 \(1\):如果相同,则结果为 \(0\). 异或运算的规则 \(0\) XOR ...
- vscode本地调试gitbook
1. windows下载安装git 2.安装nodejs 下载安装nvm https://github.com/coreybutler/nvm-windows/releases/download/1. ...
- [转载] 十问 TiDB :关于架构设计的一些思考 TiDB
做 TiDB 的缘起是从思考一个问题开始的:为什么在数据库领域有这么多永远也躲不开的坑?从 2015 年我们写下第一行代码,3 年以来我们迎面遇到无数个问题,一边思考一边做,尽量用最小的代价来快速奔跑 ...
- Shiro安全框架【认证】+【授权】
1.Shiro的核心架构 Subject:程序主体 Security Manager:安全管理器 Authentication:做认证 Authorizer:做授权 Session Manager:会 ...
- 【Javaweb】JSP标准标签库
目录 JSTL 1.什么是JSTL 2.版本 3.标签函数库 4.优点 JSTL基本概念 标签(Tag) 标签库(Tag library) 标签库描述文件(Tag Library Descriptor ...