当前位置: 首页 > news >正文

鸿蒙应用开发从入门到实战(十九):样式复用案例

大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容、欢迎关注!

上一篇文章讲解了ArkUI中样式复用思想,本节继续使用自定义组件对商品列表进行优化。

复习知识内容:

  • 创建自定义组件
  • @Builder
  • @Styles

在原来pages/layout/ProductList.ets基础上进行优化

1待优化界面

一、自定义组件优化头部

实际项目开发中,存在多个界面共享顶部的情况。因此把顶部抽取出来作为自定义组件共用。

2多界面共享顶部

1.1 静态头部制作

拷贝ic_public_back.png和ic_public_refresh.png到resources/base/media目录

拷贝pages/layout/list/ProductList.ets文件,重命名为ProductListLast.ets

(直接复制的文件,不会再resources/base/profile/main_pages.json文件中配置路由,需要手动设置:"pages/layout/list/ProductListLast",)

修改标题部分:

// 标题Row() {Image($r('app.media.ic_public_back')).width(30)Text('商品列表').fontSize(30).fontWeight(FontWeight.Bold)Blank()Image($r('app.media.ic_public_refresh')).width(30)}.width('100%')// .height(30) //控制高度.margin({ bottom: 20 })

效果

3顶部完善

1.2 头部抽取为组件

1.2.1 抽取到同一个文件中

// 自定义顶部组件
@Component
struct Header {private title: ResourceStrbuild() {// 标题Row() {Image($r('app.media.ic_public_back')).width(30)Text(this.title) //从外层传入.fontSize(30).fontWeight(FontWeight.Bold)Blank()Image($r('app.media.ic_public_refresh')).width(30)}.width('100%')// .height(30) //控制高度// .margin({ bottom: 20 })  //放到外层控制}
}

原来头部的内容替换为自定义组件使用

// 使用自定义组件Header({ title: '商品列表' }).margin({bottom:20})

效果和原来一致。

1.2.2 单独抽取为一个文件

在pages/component目录新建common目录,新建ArkTS File,名称为:CommonComponents.ets,并将自定义顶部组件代码粘贴进去,并通过export将组件导出。

// 自定义顶部组件
@Component
export struct Header {private title: ResourceStrbuild() {// 标题Row() {Image($r('app.media.ic_public_back')).width(30)Text(this.title) //从外层传入.fontSize(30).fontWeight(FontWeight.Bold)Blank()Image($r('app.media.ic_public_refresh')).width(30)}.width('100%')// .height(30) //控制高度// .margin({ bottom: 20 })  //放到外层控制}
}

回到ProductListLast.ets文件,导入自定义组件

// 导入自定义顶部组件
import {Header} from '../../component/common/CommonComponents'

二、自定义构建函数优化UI结构

以上代码中,可读性较差,可以把商品列表的部分封装起来,自定义组件或自定义构建函数都可以优化。

2.1 全局自定义构建函数

通过@Builder自定义构建函数,将商品卡片信息放置到函数中,函数定义在全局

// 全局自定义构建函数
@Builder function ItemCard(item:Item2){Row({ space: 10 }) {Image(item.image).width(100)Column({ space: 4 }) {if (item.discount) {Text(item.name).fontSize(20).fontWeight(FontWeight.Bold)Text('原价:¥' + item.price).fontColor('#CCC').fontSize(14).decoration({ type: TextDecorationType.LineThrough })Text('折扣价:¥' + (item.price - item.discount)).fontColor('#F36').fontSize(18)Text('补贴:¥' + item.discount).fontColor('#F36').fontSize(18)} else {Text(item.name).fontSize(20).fontWeight(FontWeight.Bold)Text('¥' + item.price).fontColor('#F36').fontSize(18)}}.height('100%').alignItems(HorizontalAlign.Start)}.width('100%').backgroundColor('#FFF').borderRadius(20).height(120).padding(10)
}

将原有线上组件的地方替换为函数调用

ItemCard(item)

这样,界面效果不变,但是代码更简洁,可读性更高。

2.2 局部自定义构建函数

函数定义在组件内部,将以上组件代码拷贝,并去掉function关键字

// 局部自定义构建函数 不要function关键字@Builder  ItemCard(item:Item2){Row({ space: 10 }) {Image(item.image).width(100)Column({ space: 4 }) {if (item.discount) {Text(item.name).fontSize(20).fontWeight(FontWeight.Bold)Text('原价:¥' + item.price).fontColor('#CCC').fontSize(14).decoration({ type: TextDecorationType.LineThrough })Text('折扣价:¥' + (item.price - item.discount)).fontColor('#F36').fontSize(18)Text('补贴:¥' + item.discount).fontColor('#F36').fontSize(18)} else {Text(item.name).fontSize(20).fontWeight(FontWeight.Bold)Text('¥' + item.price).fontColor('#F36').fontSize(18)}}.height('100%').alignItems(HorizontalAlign.Start)}.width('100%').backgroundColor('#FFF').borderRadius(20).height(120).padding(10)
}

在原来商品列表处进行调用,条用局部自定义组件,需要使用this关键字

this.ItemCard(item) //局部组件使用

三、自定义样式装饰器优化样式

3.1 容器全局样式

将Column的通用样式抽取到自定义样式函数fillScreen中

将fillScreen放到组件外

// 自定义全局公共样式
@Styles function fillScreen(){.width('100%').height('100%').backgroundColor('#EFEFEF').padding(20)
}

使用

Column({ space: 8 })
{...}
// 自定义样式
.fillScreen()

3.2 容器局部样式

将fillScreen放到组件内,去掉function关键字

// 自定义局部公共样式@Styles  fillScreen(){.width('100%').height('100%').backgroundColor('#EFEFEF').padding(20)}

使用方式不变,抽取后预览效果一致。

3.3 商品信息样式抽取

将商品信息样式中的价格样式抽取到公共全局样式中,由于fontColor和fontSize是Text专有的,不是公共样式,因此使用@Styles会报错,应该使用Extend(Text),并且Textend只能写在全局。

// 自定义全局价格样式
// @Styles function priceText(){
@Extend(Text) function priceText(){  //Extend继承模式不能写在组件内,只能写在全局.fontColor('#F36').fontSize(18)
}

将原来的样式方法改为自定义方法即可

// .fontColor('#F36')
// .fontSize(18)
.priceText()

这样,不仅代码层次更清晰,还可以更方便的维护和修改,只需要修改公共样式,其它引用的地方就可以直接被修改。

《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容,防止迷路,欢迎关注!

http://www.zskr.cn/news/18694.html

相关文章:

  • 2025 年最新推荐冰醋酸厂商综合实力排行榜: 厂商定制服务与仓储能力深度解析昆山/太仓/吴江区/吴中区/相城区/姑苏区冰醋酸厂商推荐
  • 中电金信:“源启大模型文本生成算法”成功通过互联网信息服务算法备案
  • 2025 年冷热冲击试验箱生产厂家最新推荐榜:聚焦三箱 / 两箱 / 吊篮式 / 小型 / 风冷式 / 可程式设备,精选优质企业助力高效选购
  • 批量文件重命名工具(带撤销功能)
  • Trae与Gitee MCP强强联合:AI编程生态迎来重大升级
  • 1_数组
  • 创建数字遗嘱:为亲人留下数字足迹指南
  • 2025 年最新推荐压缩机厂家排行榜:聚焦医药 / 医疗 / 食品 / 冷链 / 工业领域优质企业及核心优势盘点
  • 推荐系统评估、偏见与算法解析
  • 详细介绍:VScode(Visual Studio Code)常用配置大全(持续更新)
  • 2025 年车床生产厂家最新推荐排行榜:涵盖数控 / 卧式 / 斜床身 / 重型等多类型设备,助力企业精准选购优质车床品牌
  • 2025 年磨床厂家最新推荐排行榜:平面磨床 / 外圆磨床 / 数控磨床等优质设备品牌深度解析与核心竞争力测评
  • 2025 年最新推荐球墨铸铁管厂家排行榜:涵盖自来水 / 污水 / 消防等多场景适用优质品牌权威推荐
  • OSI模型-笔记
  • 痞子衡嵌入式:如果i.MXRT1xxx在Hab关闭时出现偶发性启动失败,请先检查JTAG电路
  • 如何使用notepad++查看二进制bin文件
  • 2025 年最新外呼系统机构最新推荐排行榜:深度解析技术实力、服务体系及行业适配方案电话营销外呼系统/智能外呼系统/外呼系统电销卡/外呼系统平台搭建推荐
  • CF848C Goodbye Souvenir 题解(CDQ分治)
  • [Python] python3 使用虚拟环境
  • 2025 年汽车刹车卡钳厂家最新推荐榜单:原厂适配 / 高性能 / 新能源专用等多类型产品深度解析及选购指南分体锻造/大轮毂/高性能/新能源汽车刹车卡钳厂家推荐
  • DevExpress WinForms中文教程:Data Grid - 如何自定义排序和非排序列?
  • 国产代码管理平台Gitee:破解企业级Git自建难题的密钥
  • 2025 年蜂巢/高强/HDPE/PET/高分子/塑料/插接/土工格室厂家口碑推荐榜:聚焦品质与服务,助力工程选材更高效
  • 基于K近邻(KNN)算法在MATLAB中实现人脸识别
  • Vue大屏可视化自适应(等比列缩放)方案✔️✔️✔️✨
  • 单调队列 (1) - 详解
  • 2025 年 密度 / 净化 / 零醛添加 / 装修 / 生态板 / 指接板板材厂家推荐:纯品梅花深耕高端定制,打造健康家居板材优质选择
  • PHP 与 HTML 混写基础
  • 2025 年隧道/车丝/打孔/矿用/R780/钢花钢管厂家推荐榜:精准匹配施工需求,优选可靠供应商
  • marimo python 响应式notebook 框架