01. HarmonyOS应用开发实践与技术解析

文章目录

    • 前言
    • 项目概述
    • HarmonyOS应用架构
      • 项目结构
      • Ability生命周期
    • ArkTS语言特性
      • 装饰器
      • 状态管理
    • UI组件与布局
      • 基础组件
      • 响应式布局
      • 样式与主题
    • 页面路由与参数传递
      • 页面跳转
      • 参数接收
    • 数据绑定与循环渲染
      • 数据接口定义
      • 循环渲染
    • 条件渲染
    • 组件生命周期
    • 最佳实践与性能优化
      • 组件复用
      • 响应式设计
      • 性能优化

前言

随着华为HarmonyOS生态的不断发展,越来越多的开发者开始关注并投入到HarmonyOS应用开发中。本文将通过一个实际的项目案例,详细讲解HarmonyOS应用开发的核心技术和最佳实践,帮助开发者快速掌握HarmonyOS应用开发的要点。

项目概述

本项目是一个基于HarmonyOS的学习应用,主要包含了一个仪表盘示例页面,用于展示业务数据概览。项目采用了ArkTS语言开发,使用了HarmonyOS提供的UI框架和组件,实现了响应式布局和页面路由等功能。

HarmonyOS应用架构

项目结构

HarmonyOS应用的项目结构遵循一定的规范,主要包括以下几个部分:

  • entry:应用的入口模块,包含了应用的主要代码和资源
    • src/main/ets:ArkTS代码目录
      • entryability:应用的Ability实现,是应用的入口点
      • pages:应用的页面组件
      • components:可复用的UI组件
      • common:公共工具和常量
    • src/main/resources:应用的资源文件,如图片、字符串等
    • src/main/module.json5:模块配置文件

Ability生命周期

Ability是HarmonyOS应用的基本组成单元,类似于Android的Activity。在本项目中,EntryAbility是应用的主入口,它的生命周期包括:

export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {// Ability创建时调用}onDestroy(): void {// Ability销毁时调用}onWindowStageCreate(windowStage: window.WindowStage): void {// 窗口创建时调用,在这里加载主页面windowStage.loadContent('pages/Index', (err) => {// 页面加载回调});}onWindowStageDestroy(): void {// 窗口销毁时调用}onForeground(): void {// Ability进入前台时调用}onBackground(): void {// Ability进入后台时调用}
}

ArkTS语言特性

ArkTS是HarmonyOS应用开发的首选语言,它基于TypeScript,增加了声明式UI和状态管理等特性。

装饰器

ArkTS中的装饰器是一种特殊的声明,可以附加在类、方法、访问器、属性或参数上。本项目中使用了多种装饰器:

  1. @Entry:标记一个组件为页面入口
  2. @Component:定义一个自定义组件
  3. @State:定义组件内部的状态变量,当状态变化时会触发UI刷新
  4. @Prop:用于父组件向子组件传递数据

例如,在NavBar组件中:

@Component
export struct Navbar {@Prop title: string = ''build() {// 组件UI构建}
}

状态管理

ArkTS提供了多种状态管理机制,用于处理组件内部状态和组件间通信:

  1. @State:组件内部状态,变化时会触发组件重新渲染
  2. @Prop:父组件向子组件传递的属性,子组件不能修改
  3. @Link:双向绑定,父子组件可以共同修改
  4. AppStorage:应用级的状态存储

在DashboardExample组件中,使用@State管理数据:

@State screenWidth: number = 0
@State dataCards: DashboardCardItem[] = [{title: '今日销售额', value: '8,846', unit: '元', trend: '+12.5%', color: '#2A9D8F'},// 其他数据...
]

UI组件与布局

基础组件

HarmonyOS提供了丰富的基础UI组件,本项目中使用了:

  1. Text:文本显示组件
  2. Image:图片显示组件
  3. Column:垂直布局容器
  4. Row:水平布局容器
  5. Flex:弹性布局容器
  6. List:列表容器

响应式布局

HarmonyOS支持响应式布局,可以根据屏幕尺寸自适应调整UI。在DashboardExample中,通过检测屏幕宽度实现响应式布局:

aboutToAppear() {// 获取屏幕宽度,用于响应式布局this.screenWidth = px2vp(AppStorage.Get<number>('windowWidth') || 720)
}// 根据屏幕宽度决定每行显示的卡片数量
Flex({ wrap: FlexWrap.Wrap, justifyContent: this.screenWidth > 600 ? FlexAlign.Start : FlexAlign.SpaceAround }) {// 卡片布局
}

样式与主题

ArkTS支持链式调用设置组件样式,使UI代码更加简洁:

Text(card.value).fontSize(28).fontWeight(FontWeight.Bold).fontColor(card.color)

还可以通过设置backgroundColor、borderRadius、shadow等属性实现丰富的视觉效果:

.width(this.screenWidth > 600 ? '22%' : '45%')
.height(120)
.padding(16)
.margin(8)
.borderRadius(12)
.backgroundColor(Color.White)
// 添加卡片阴影效果
.shadow({radius: 4, color: '#1A000000', offsetY: 2})

页面路由与参数传递

HarmonyOS提供了router模块用于页面间导航和参数传递。

页面跳转

在Index页面中,通过router.pushUrl实现页面跳转:

router.pushUrl({url: item.path,params: {desc: item.desc,value: item.value}
})

参数接收

在目标页面中,通过router.getParams获取传递的参数:

onPageShow(): void {// 获取传递过来的参数对象const params = router.getParams() as Record<string, string>;//   获取传递的值if (params) {this.desc = params.desc as stringthis.title = params.value as string}
}

数据绑定与循环渲染

数据接口定义

使用TypeScript接口定义数据结构,提高代码的可读性和可维护性:

export interface DashboardCardItem {title: string;    // 卡片标题value: string;    // 数值内容unit: string;     // 数值单位trend: string;    // 趋势变化color: string;    // 卡片主题颜色
}

循环渲染

使用ForEach语法实现列表循环渲染:

ForEach(this.dataCards, (card: DashboardCardItem) => {// 数据卡片UI构建
})

条件渲染

ArkTS支持在UI构建中使用条件表达式,实现动态UI:

// 根据趋势是否为正值显示不同颜色
Text(card.trend).fontSize(14).fontColor(card.trend.includes('+') ? '#2A9D8F' : '#E76F51')

组件生命周期

ArkTS组件有多个生命周期回调函数:

  1. aboutToAppear:组件即将出现时调用,用于初始化
  2. aboutToDisappear:组件即将消失时调用,用于清理资源
  3. onPageShow:页面显示时调用
  4. onPageHide:页面隐藏时调用
  5. onBackPress:处理返回按键事件
aboutToAppear() {// 初始化工作this.screenWidth = px2vp(AppStorage.Get<number>('windowWidth') || 720)
}onPageShow(): void {// 页面显示时的处理const params = router.getParams() as Record<string, string>;// ...
}

最佳实践与性能优化

组件复用

将通用UI封装为可复用组件,如本项目中的NavBar组件:

@Component
export struct Navbar {@Prop title: string = ''build() {Row(){Image($r('app.media.tornLeft')).width(30).onClick(()=>{router.back()})Text(this.title).fontSize(20).fontWeight(800)}.justifyContent(FlexAlign.SpaceBetween).width('100%').height('50')}
}

响应式设计

根据不同屏幕尺寸调整布局,提升用户体验:

.width(this.screenWidth > 600 ? '22%' : '45%')

性能优化

  1. 懒加载:只在需要时加载组件和资源
  2. 状态管理:合理使用状态管理机制,避免不必要的重渲染
  3. 资源复用:复用组件和资源,减少内存占用

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

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

相关文章

【虚拟机 IP 配置深度剖析】

虚拟机 IP 配置深度剖析 在虚拟机的使用过程中&#xff0c;IP 配置犹如搭建房屋的基石&#xff0c;是确保虚拟机与外部网络顺畅通信、与其他设备高效交互的关键所在。本文将以 CentOS 虚拟机为例&#xff0c;深入解读 IP 配置的奥秘。 一、认识网络模式 • NAT 模式&#xf…

【Python 数据结构 5.栈】

目录 一、栈的基本概念 1.栈的概念 2.入栈 入栈的步骤 3.出栈 出栈的步骤 4.获取栈顶元素 获取栈顶元素的步骤 二、 Python中的栈 顺序表实现 链表实现 三、栈的实战 1.LCR 123. 图书整理 I 思路与算法 2.LCR 027. 回文链表 思路与算法 3.1614. 括号的最大嵌套深度 思路与算法 …

Machine Learning 初探

前置知识 pandas 读取文件&#xff1a;read_csv查看信息 describe&#xff1a;查看整体信息&#xff0c;包括每列的平均值、最大最小值、标准差等head&#xff1a;输出头部几行数据columns&#xff1a;输出所有列名loc&#xff1a;查询数据&#xff0c;或是根据索引取对应的数…

2025年2月个人工作生活总结

本文为 2025年2月工作生活总结。 工作记录 AI浪潮 AI非常火&#xff0c;春节至今&#xff0c;到处充斥着大量和AI、DeepSeek有关的新闻。领导也一再强调要用AI&#xff0c;甚至纳入到新一年的考核里。再往上&#xff0c;大领导开会的新闻稿里也作出要求&#xff0c;不能停下脚…

SpringBoot @ConfigurationProperties 注解使用

ConfigurationProperties 用于将配置文件&#xff08;如 application.properties 或 application.yml&#xff09;中的属性批量绑定到一个 Java Bean 中。 1. 定义配置文件 在 application.properties 或 application.yml 中定义一组具有相同前缀的属性。 application.yml &a…

刚安装docker并启动docker服务: systemctl restart docker报错解决

root:/home/lzw# sudo systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xeu docker.service" for details. 1、问题描述 启动doc…

JavaScript的this指向,一次彻底讲清楚

JavaScript 中的 this 指向是一个非常重要且容易混淆的概念。它的值取决于函数被调用的上下文,而不是函数定义的位置。以下是 this 指向的详细解析: 1. 默认绑定(Default Binding) 在非严格模式下,如果函数是直接调用(而不是作为对象的方法或构造函数等),this 默认指向…

MFC: 控件根据文本内容大小自动调整

背景&#xff1a; 针对不同语言下&#xff0c;控件显示不全的现象&#xff1b; 例如&#xff1a; 现象1&#xff1a;中文下显示全部信息&#xff0c;英语下只能显示部分文字 现象2&#xff1a;中文下显示不全## 实现思路&#xff1a; 控件绑定按钮计算控件文本长度根据文本长…

SpringBoot 整合mongoDB并自定义连接池,实现多数据源配置

要想在同一个springboot项目中使用多个数据源&#xff0c;最主要是每个数据源都有自己的mongoTemplate和MongoDbFactory。mongoTemplate和MongoDbFactory是负责对数据源进行交互的并管理链接的。 spring提供了一个注解EnableMongoRepositories 用来注释在某些路径下的MongoRepo…

软件测试中的BUG

文章目录 软件测试的生命周期BugBug 的概念描述 Bug 的要素案例Bug 级别Bug 的生命周期与开发产生争执怎么办&#xff1f;【高频面试题】先检查自身&#xff0c;Bug 是否描述的不清楚站在用户角度考虑并抛出问题Bug 的定级要有理有据提⾼自身技术和业务水平&#xff0c;做到不仅…

泵吸式激光可燃气体监测仪:快速精准守护燃气管网安全

在城市化进程加速的今天&#xff0c;燃气泄漏、地下管网老化等问题时刻威胁着城市安全。如何实现精准、高效的可燃气体监测&#xff0c;守护“城市生命线”&#xff0c;成为新型基础设施建设的核心课题。泵吸式激光可燃气体监测仪&#xff0c;以创新科技赋能安全监测&#xff0…

第J3-1周:DenseNet算法 实现乳腺癌识别

文章目录 一、前言二、前期准备1.设置GPU2.划分数据集 三、搭建网络模型1.DenseLayer模块2.DenseBlock模块3.Transition模块4.构建DenseNet5.构建densenet121 四、训练模型1.编写训练函数2.编写测试函数3.正式训练 五、结果可视化1.Loss与Accuracy图2.模型评估 总结&#xff1a…

【JAVA面试题】== 和 equals() 的区别与使用场景

在 Java 面试中&#xff0c; 和 equals() 的区别是一个高频考点。理解它们的底层原理和使用场景&#xff0c;对于掌握 Java 基础知识至关重要。本文将从 基本概念、底层实现 和 实际应用 三个方面&#xff0c;深入解析 和 equals() 的区别。 1. 基本概念 1.1 运算符 作用&a…

-bash: lsof: command not found

一、问题说明 执行如下命令时报错&#xff1a; # lsof |grep deleted > deleted_file -bash: lsof: command not found二、处理方法 # yum -y install lsof安装完成后可成功执行上面的命令。

摄像头应用编程(三):多平面视频采集

文章目录 1、前言2、环境介绍3、步骤4、应用程序编写5、测试5.1、编译应用程序5.2、运行应用程序 6、总结 1、前言 在查看摄像头类型时&#xff0c;大致可以分为两类&#xff1a;Video Capture 和 Video Capture Multiplanar。 本次应用程序主要针对类型为Video Capture Multi…

本地部署 Traefik 的完整教程

Traefik 是一款现代化的反向代理和负载均衡工具,专为云原生环境设计。它支持自动服务发现、动态配置更新以及多种后端(如 Docker、Kubernetes、Consul 等)。本教程将指导你如何在本地部署 Traefik,并配置其作为反向代理和负载均衡器。 1. 准备工作 在开始之前,请确保你的…

三维数据可视化与表面重建:Marching Cubes算法的原理与应用

1. 引言 随着现代医学影像技术的飞速发展&#xff0c;三维数据的可视化与重建已成为医学研究、临床诊断和手术规划的重要工具。在众多三维重建算法中&#xff0c;Marching Cubes算法因其高效、稳定的特性成为从离散数据场中提取等值面的经典方法。本报告将深入探讨Marching Cu…

MySql面试总结(二)

WHERE 子句优化 截至2024年7月,MySQL最新稳定版本是8.2,并不存在MySQL 8.4 。下面从常见的几个方面为你介绍 MySQL 8.x 中 WHERE 子句的优化方法: 1. 确保使用索引 原理:索引可以加快数据的查找速度,当 WHERE 子句中的条件列有索引时,MySQL 可以直接定位到符合条件的数…

【图论】判断图中有环的两种方法及实现

判断图中有环的两种方法及实现 在图论中&#xff0c;检测有向图是否存在环是常见问题。本文将介绍两种主流方法&#xff1a;DFS三色标记法和拓扑排序&#xff08;Kahn算法&#xff09;&#xff0c;并提供对应的C代码实现。 方法一&#xff1a;DFS三色标记法 核心思想 通过深…

11.【线性代数】——矩阵空间,秩1矩阵,小世界图

十一 矩阵空间&#xff0c;秩1矩阵&#xff0c;小世界图 1. 矩阵空间交集 和 和集 2. 所有解空间3. r 1 r1 r1的矩阵4. 题目5. 小世界图 空间&#xff1a;组成空间的元素的线性组合都在这个空间中。 1. 矩阵空间 举例&#xff1a;矩阵空间&#xff08; M M M 所有3x3的矩阵&…