HarmonyOS NEXT应用开发之跨文件样式复用和组件复用

介绍

本示例主要介绍了跨文件样式复用和组件复用的场景。在应用开发中,我们通常需要使用相同功能和样式的ArkUI组件,例如购物页面中会使用相同样式的Button按钮、Text显示文字,我们常用的方法是抽取公共样式或者封装成一个自定义组件到公共组件库中以减少冗余代码。

效果图预览

使用说明

  1. 点击购物车页面的list列表跳转商品详情页。
  2. 两个页面的button组件、text组件、Image等组件复用相同的样式。
  3. 购物车页面使用了自定义封装的Image+Text的图文复合组件。

实现思路

一、跨文件样式复用

适用场景:当需要向外提供单一组件的样式定制效果时,推荐使用这种方案。使用方在调用接口时,编码量相对方式二更少,仅需几行即可完成调用,使用便捷。

  1. 提供方创建AttributeModifier接口的实现类。
// attributeModifier.ets/*自定义class实现Text的AttributeModifier接口
*/
export class CommodityText implements AttributeModifier<TextAttribute> {textType: TextType = TextType.TYPE_ONE;textSize: number = 15;constructor( textType: TextType, textSize: number) {this.textType = textType;this.textSize = textSize;}applyNormalAttribute(instance: TextAttribute): void {if (this.textType === TextType.TYPE_ONE) {instance.fontSize(this.textSize);instance.fontColor($r('app.color.orange'));instance.fontWeight(FontWeight.Bolder);instance.width($r('app.string.max_size'));} else if (this.textType === TextType.TYPE_TWO) {instance.fontSize(this.textSize);instance.fontWeight(FontWeight.Bold);instance.fontColor($r('sys.color.ohos_id_counter_title_font_color'));instance.width($r('app.string.max_size'));} else if (this.textType === TextType.TYPE_Three) {instance.fontColor(Color.Gray);instance.fontSize(this.textSize);instance.fontWeight(FontWeight.Normal);instance.width($r('app.string.max_size'));} else if (this.textType === TextType.TYPE_FOUR) {instance.fontSize(this.textSize);instance.fontColor($r('app.color.orange'));instance.textAlign(TextAlign.Center);instance.border({ width: $r('app.float.float_1'), color: $r('app.color.orange'), style: BorderStyle.Solid });instance.margin({ right: $r('app.float.float_10') });}}
}
/*枚举文本类型
*/
export enum TextType {TYPE_ONE,TYPE_TWO,TYPE_Three,TYPE_FOUR
}
  1. 使用方创建提供方的AttributeModifier实现类实例,并作为系统组件attributeModifier属性方法的参数传入。
// ShoppingCart.ets
import { CommodityText } from '../common/attributeModifier';@Component
export struct Details {// 使用方创建提供方的AttributeModifier实现类实例@State textOne: CommodityText = new CommodityText(TextType.TYPE_ONE, 15);...    build(){...Text($r('app.string.store_name'))// TODO:知识点:将入参的AttributeModifier类实例与系统组件绑定.attributeModifier(this.textOne).fontColor($r('sys.color.ohos_id_counter_title_font_color'))...}
}// Details.ets
import { CommodityText } from '../common/attributeModifier';@Component
export struct Details {// 使用方创建提供方的AttributeModifier实现类实例@State textOne: MyTextModifier = new MyTextModifier(TextType.TYPE_ONE, 30);...    build(){...Text($r('app.string.commodity_price'))// 动态设置组件样式.attributeModifier(this.textOne).width($r('app.float.float_100'))...}
}
二、跨文件组件复用

适用场景:适用于多个原生组件结合的场景,如Image+Text等复合自定义组件。

  1. 提供方在公共组件库中创建公用的自定义组件,该组件支持外部传入attributeModifier属性。
//CommonText.ets/*** 自定义封装图文组件*/
@Component
export struct ImageText {@State item: string | Resource = $r('app.string.text');@State textOneContent: string | Resource = $r('app.string.text');@State textTwoContent: string | Resource = $r('app.string.text');@State textThreeContent: string | Resource = $r('app.string.text');@State imageSrc: PixelMap | ResourceStr | DrawableDescriptor = $r('app.media.icon');// TODO:知识点:接受外部传入的AttributeModifier类实例,可以只定制部分组件,选择性传入参数。@State textOne: AttributeModifier<TextAttribute> = new TextModifier();@State textTwo: AttributeModifier<TextAttribute> = new TextModifier();@State textThree: AttributeModifier<TextAttribute> = new TextModifier();@State imageModifier: AttributeModifier<ImageAttribute> = new ImageModifier();@State checkboxModifier: AttributeModifier<CheckboxAttribute> = new CheckboxModifier();build() {Row() {Row() {Checkbox().attributeModifier(this.checkboxModifier)// TODO:知识点:AttributeModifier不支持入参为CustomBuilder或Lamda表达式的属性,且不支持事件和手势。image只能单独通过入参传递使用。Image(this.imageSrc).attributeModifier(this.imageModifier)}.margin({ right: $r('app.float.float_10'), bottom: $r('app.float.float_15') })Column({ space: COLUMN_SPACE }) {// TODO:知识点:将入参的AttributeModifier类实例与系统组件绑定Text(this.item).attributeModifier(this.textTwo)Text(this.textThreeContent).attributeModifier(this.textThree)CommonText({ textFour: new TextModifier() })Text(this.textOneContent).attributeModifier(this.textOne).fontColor($r('app.color.orange'))}}.padding({ top: $r('app.float.float_5') }).width($r('app.string.max_size')).height($r('app.string.max_size'))}
}/*自定义class实现image的AttributeModifier接口,用于初始化
*/
class ImageModifier implements AttributeModifier<ImageAttribute> {applyNormalAttribute(instance: ImageAttribute): void {instance.width($r('app.float.float_100'));instance.height($r('app.float.float_100'));}
}/*自定义class实现text的AttributeModifier接口,用于初始化
*/
class TextModifier implements AttributeModifier<TextAttribute> {applyNormalAttribute(instance: TextAttribute): void {instance.fontSize($r('app.float.float_12'));instance.fontColor($r('app.color.orange'));instance.textAlign(TextAlign.Center);instance.border({ width: $r('app.float.float_1'), color: $r('app.color.orange'), style: BorderStyle.Solid });instance.margin({ right: $r('app.float.float_10') });}
}/*自定义class实现checkbox的AttributeModifier接口,用于初始化
*/
class CheckboxModifier implements AttributeModifier<CheckboxAttribute> {applyNormalAttribute(instance: CheckboxAttribute): void {instance.width($r('app.float.float_15'));instance.height($r('app.float.float_15'));}
}
  1. 使用方分别实现Image组件和Text组件的AttributeModifier接口实现类。
/*自定义class实现Image组件的AttributeModifier接口
*/
export class ImageModifier implements AttributeModifier<ImageAttribute> {width: Length | Resource = 0;height: Length | Resource = 0;constructor(width: Length | Resource, height: Length | Resource) {this.width = width;this.height = height;}applyNormalAttribute(instance: ImageAttribute): void {instance.width(this.width);instance.height(this.height);instance.borderRadius($r('app.float.float_10'));}
}/*自定义class实现Text的AttributeModifier接口
*/
export class CommodityText implements AttributeModifier<TextAttribute> {...
}
  1. 使用方创建Image组件和Text组件的AttributeModifier接口实现类实例,并作为提供方自定义组件CustomImageText的入参传入。
@Component
export struct ShoppingCart {// TODO:知识点:使用方创建Image组件和Text组件的AttributeModifier接口实现类实例@State textOne: CommodityText = new CommodityText(TextType.TYPE_ONE, 15);@State textTwo: CommodityText = new CommodityText(TextType.TYPE_TWO, 17);@State textThree: CommodityText = new CommodityText(TextType.TYPE_Three, 15);@State imageModifier: ImageModifier = new ImageModifier(100, 100);@State checkboxModifier: CheckboxModifier = new CheckboxModifier();build() {...// AttributeModifier实例作为提供方自定义组件ImageText的入参传入。ImageText({item: item,textOne: this.textOne,textTwo: this.textTwo,textThree: this.textThree,imageModifier: this.imageModifier,imageSrc: $r('app.media.icon'),checkboxModifier: this.checkboxModifier,textOneContent: $r('app.string.commodity_price'),textTwoContent: $r('app.string.commodity_name'),textThreeContent: $r('app.string.commodity_model')})... }
}

高性能知识点

本示例使用了动态属性设置和自定义封装公共组件,实现了跨文件样式和组件复用,减少了工程很多冗余的代码。

工程结构&模块类型

dynamicattributes
|---common
|   |---AttributeModifier.ets               // 自定义AttributeModifier接口
|   |---CommonText.ets                      // 自定义组件封装
|   |---LazyForEach.ets                     // 懒加载
|---pages
|   |---ShoppingCart.ets                    // 页面一:购物车
|   |---Details.ets                         // 页面二:详情页

模块依赖

本示例依赖路由管理模块。

参考资料

动态属性设置

ArkUI组件封装及复用场景介绍

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/761388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell编程入门(笔记)

1、shell编程基础&#xff1a; 1.1、shell的解释执行功能 1.2、什么是shell程序&#xff1f; 1.3、shell程序编程的主要内容 1.4、shell程序的第一行 1.5、变量要求 1.6、环境变量和只读变量 1.7、位置参量 1.8、位置参量列表 1.9、数组 2、输入输出 2.1、输入-read命令 2.2…

Pytest用例间参数传递的两种实现方式示例

前言 我们在做接口自动化测试的时候&#xff0c;会经常遇到这种场景&#xff1a;接口A的返回结果中的某个字段&#xff0c;是接口B的某个字段的入参。如果是使用postman&#xff0c;那我们可以通过设置后置变量&#xff0c;然后在需要使用的地方通过{{}}的方式来进行调用。但是…

银行卡账户交易异常已被限制部分功能,怎么办?

文章目录 I 解决方案1.1 限制原因1.2 防范1.3 案例1.4 用卡安全小知识II 个人账户收款监管规则III 反诈提醒I 解决方案 处理非柜面交易限制,只能到开户行柜台申请解除。异地卡的,需要联系开户行,提供相关资料。有些地方银行的,比如长沙银行,可以使用线上柜台进行审核。先到…

Flume入门概述及安装部署

目录 一、Flume概述1.1 Flume定义1.2 Flume基础架构 二、Flume安装部署 一、Flume概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构&#xff0c;灵活简单。 1.2 Flume基础…

13、Deconstructing Denoising Diffusion Models for Self-Supervised Learning

简介 研究了最初用于图像生成的去噪扩散模型(DDM)的表示学习能力 解构DDM&#xff0c;逐步将其转变为经典的去噪自动编码器(DAE) 探索现代ddm的各个组成部分如何影响自监督表征学习 结论&#xff1a; 只有很少的现代组件对于学习良好的表示是至关重要的&#xff0c;而其他许多…

智能ai写作神器,推荐5个ai在线写作生成器

智能AI写作神器&#xff0c;是不是听起来就很神奇&#xff1f;它们可以帮助我们省去无尽的头疼和煎熬&#xff0c;让我们的文字轻松流畅&#xff0c;幽默风趣。今天&#xff0c;我要向大家推荐五款AI在线写作生成器&#xff0c;让我们一起来看看吧&#xff01; 第一个&#xff…

训练YOLOv9-S

1. YOLOv9-S网络结构 1.1 改前改后的网络结构&#xff08;参数量、计算量&#xff09;对比 修改前调用的yolo.py测试的yolov9.yaml的打印网络情况&#xff0c;包含参数量、计算量 修改后调用的yolo.py测试的yolov9.yaml的打印网络情况&#xff0c;包含参数量、计算量 1.2 …

flutter实现视频播放器,可根据指定视频地址播放、设置声音,进度条拖动,下载等

需要装依赖&#xff1a; gallery_saver: ^2.3.2video_player: ^2.8.3 实现代码 import dart:async; import dart:io;import package:flutter/material.dart; import package:gallery_saver/gallery_saver.dart; import package:path_provider/path_provider.dart; import pac…

Revit2020也能玩衍生式设计?

Revit2021新增的一个好玩功能就是衍生式设计&#xff0c;但是Autodesk2021系列的激活目前还比较麻烦&#xff0c;尤其是要装多款2021软件的时候&#xff0c;注册机用起来还挺烦人的&#xff0c;于是&#xff0c;为了省事&#xff0c;我把GenerativeDesignRevit节点包扔到了Dyna…

大模型应用开发:手把手教你部署并使用清华智谱GLM大模型

部署一个自己的大模型&#xff0c;没事的时候玩两下&#xff0c;这可能是很多技术同学想做但又迟迟没下手的事情&#xff0c;没下手的原因很可能是成本太高&#xff0c;近万元的RTX3090显卡&#xff0c;想想都肉疼&#xff0c;又或者官方的部署说明过于简单&#xff0c;安装的时…

邮箱合法性的判断与indexOf()==-1的解释

判断邮箱格式输入的对错&#xff0c;简化为是否有“.”&#xff0c;&#xff0c;前后是否有字符。 需要用到字符串的遍历比对&#xff0c;字符串的抓取与赋值。 代码主体&#xff1a; public class youpanduanyouxiangshifouhefa {//判断输入的邮箱是否合法public static vo…

Java设计模式 | 工厂方法模式

工厂方法模式 针对简单工厂模式案例中的缺点&#xff0c;使用工厂方法模式就可以完美的解决&#xff0c;完全遵循开闭原则。简单工厂模式只有一个工厂类&#xff0c;负责创建所有产品&#xff0c;如果要添加新的产品&#xff0c;就需要修改工厂类的代码。而工厂方法模式引入了…

Halcon ORC字符识别

OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是通过使用OCR工具实现的。Halcon提供了一些用于进行字符识别的函数和工具&#xff0c;可以帮助用户实现文本的自动识别和提取。 read_ocr_class_mlp&#xff1a;用于读取一个经过训练好的OC…

第二十八天-ES6标准入门和Flex布局

目录 1.ES6标准入门 2.ES6与JavaScript关系 3.ES6常用新特性 1.变量与常量 1.let三大特性 2.常量三大特征 2.解构赋值 1.数组解构赋值 2.对象解构赋值 3.字符串解构赋值 3.函数与箭头函数 1.函数 2.箭头函数 4.JS的面向对象编程 5.模块化 export使用 import使用…

HEVC的编码结构

编码单元划分 CTU/CTB CTU(Coding Tree Unit)和CU组成了一个四叉树的层级结构,CTU的尺寸为64 x 64,32 x 32,16 x 16,一个CTU可以分为一个或四个CTU,对标H264的MB。 CU/CB CU/CB(Coding Unit/Coding Block),CU为亮度和色度编码单元的统称,CB特指某一个分量的的编码…

JAVA后端调用OpenAI接口 实现打字机效果(SSE)

SSE SSE&#xff08;Server-Sent Events&#xff0c;服务器发送事件&#xff09;是一种基于HTTP协议的通信技术&#xff0c;它允许服务器持续地将数据推送给客户端&#xff0c;而无需客户端发起请求。这种通信方式通常用于实时性要求较高的场景&#xff0c;如实时更新、通知、或…

C++初始化列表

本博客将讲述C初始化列表的相关内容 一.什么是初始化列表 图中红方框框的就是初始化列表 格式为&#xff1a; &#xff1a;成员变量1&#xff08;参数1&#xff09;&#xff0c;成员变量2&#xff08;参数2&#xff09; 编译器会将初始化列表一一转换成代码&#xff0c;并将…

高可用、逻辑保护、容灾、多活、妥协、流程

可用性三叉戟&#xff1a; 本地高可用性&#xff1a;消除单点故障&#xff0c;确保链路所有环节系统高可用 本地是指&#xff1a;针对生产中心的内部故障 故障类型&#xff1a;服务器、硬盘、适配器卡、网络 特点&#xff1a;快速恢复、自动的接管、实施简单 RPO-0 业务逻辑保护…

高级数据结构 <AVL树>

本文已收录至《数据结构(C/C语言)》专栏&#xff01; 作者&#xff1a;ARMCSKGT 目录 前言正文AVL树的性质AVL树的定义AVL树的插入函数左单旋右单旋右左双旋左右双旋 检验AVL树的合法性关于AVL树 最后 前言 前面我们学习了二叉树&#xff0c;普通的二叉树没有任何特殊性质&…

[Linux]互斥锁(什么是锁,为什么需要锁,怎么使用锁(接口),演示代码)

目录 一、锁的概念 一些需要了解的概念 什么是锁&#xff1f;为什么需要锁&#xff1f;什么时候使用锁&#xff1f;怎么定义锁&#xff1f; 二、锁的接口 1.初始化锁 2.加锁 3.申请锁 4.解锁 5.销毁锁 三、实践&#xff08;写代码&#xff09;&#xff1a;黄牛抢票 一…