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:模块配置文件
- src/main/ets:ArkTS代码目录
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中的装饰器是一种特殊的声明,可以附加在类、方法、访问器、属性或参数上。本项目中使用了多种装饰器:
- @Entry:标记一个组件为页面入口
- @Component:定义一个自定义组件
- @State:定义组件内部的状态变量,当状态变化时会触发UI刷新
- @Prop:用于父组件向子组件传递数据
例如,在NavBar组件中:
@Component
export struct Navbar {@Prop title: string = ''build() {// 组件UI构建}
}
状态管理
ArkTS提供了多种状态管理机制,用于处理组件内部状态和组件间通信:
- @State:组件内部状态,变化时会触发组件重新渲染
- @Prop:父组件向子组件传递的属性,子组件不能修改
- @Link:双向绑定,父子组件可以共同修改
- AppStorage:应用级的状态存储
在DashboardExample组件中,使用@State管理数据:
@State screenWidth: number = 0
@State dataCards: DashboardCardItem[] = [{title: '今日销售额', value: '8,846', unit: '元', trend: '+12.5%', color: '#2A9D8F'},// 其他数据...
]
UI组件与布局
基础组件
HarmonyOS提供了丰富的基础UI组件,本项目中使用了:
- Text:文本显示组件
- Image:图片显示组件
- Column:垂直布局容器
- Row:水平布局容器
- Flex:弹性布局容器
- 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组件有多个生命周期回调函数:
- aboutToAppear:组件即将出现时调用,用于初始化
- aboutToDisappear:组件即将消失时调用,用于清理资源
- onPageShow:页面显示时调用
- onPageHide:页面隐藏时调用
- 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%')
性能优化
- 懒加载:只在需要时加载组件和资源
- 状态管理:合理使用状态管理机制,避免不必要的重渲染
- 资源复用:复用组件和资源,减少内存占用
相关文章:
01. HarmonyOS应用开发实践与技术解析
文章目录 前言项目概述HarmonyOS应用架构项目结构Ability生命周期 ArkTS语言特性装饰器状态管理 UI组件与布局基础组件响应式布局样式与主题 页面路由与参数传递页面跳转参数接收 数据绑定与循环渲染数据接口定义循环渲染 条件渲染组件生命周期最佳实践与性能优化组件复用响应式…...
【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法
【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法 🌟 嗨,你好,我是 青松 ! 🌈 自小刺头深草里,而今渐觉出蓬蒿。 文章目录 **01 自动作诗缘起****1. 诗歌自动写作** **02 九歌的模型…...
JS基础之函数
函数使用 函数名命名规范 和变量命名基本一致> 尽量小驼峰式命名法 前缀应该为动词 命名建议:常用动词约定 动词含义can判断是否可执行某个动作has判断是否含义某个值is判断是否为某个值get获取某个值set设置某个值load加载某些数据 有返回值的函数 细节: 在函数体中使用…...
基于java SSM springboot学生信息管理系统设计和实现
基于java SSM springboot学生信息管理系统设计和实现 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 …...
【MongoDB】在Windows11下安装与使用
官网下载链接:Download MongoDB Community Server 官方参考文档:https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-windows/#std-label-install-mdb-community-windows 选择custom类型,其他默认 注意,此选…...
HTML在网页开发中的应用与重要性
## 摘要 HTML(HyperText Markup Language)是网页开发的基础语言之一,它定义了网页的结构和内容。随着互联网的快速发展,HTML不断演进,从HTML4到HTML5,其功能和特性得到了极大的增强。本文将探讨HTML在网页…...
深度学习-140-RAG技术之Agentic Chunking分块技术的实现细节和完备实现
文章目录 1 类AgenticChunker1.1 add_propositions添加命题列表1.2 add_proposition添加单个命题1.3 add_proposition_to_chunk命题添加到块中1.4 _update_chunk_summary更新块摘要1.5 _update_chunk_title更新块主题1.6 _get_new_chunk_summary获取新块摘要1.7 _get_new_chunk…...
全面中耕机与行间中耕机的作用及区别
全面中耕机与行间中耕机的作用及区别 一、作用对比 全面中耕机 核心作用:主要用于整地前的土壤准备和休闲地管理,包括播前整地、土壤改良、化肥与化学药剂的混合等,为大面积种植创造均匀的种床环境。 附加功能:通过深耕ÿ…...
CSS—显示模式display、定位position、元素溢出overflow、float浮动
目录 1.显示模式display 2.定位position 3.元素溢出overflow 4.float浮动 1.显示模式display 显示模式常见元素特点块级元素div标签、h1-h6、p、form、header、footer、section、ul、li、ol、dl、dt独占一行,默认垂直布局,没有设置宽高时宽度继承父级…...
Linux调试器gdb和cgdb的使用【Ubuntu】
文章目录 一、样例代码二、预备三、常见使用1、cgdb调试操作2、gdb调试操作 四、常见技巧1、 **安装cgdb:**2、watch3、set var确定问题原因4、条件断点 一、样例代码 // mycmd.c #include <stdio.h>int Sum(int s, int e) {int result 0;for(int i s; i < e; i){r…...
清华大学DeepSeek详细使用教程共6版免费下载
「清华北大-Deepseek使用手册」 链接:https://pan.quark.cn/s/98782f7d61dc 「清华大学Deepseek整理) 1-6版本链接:https://pan.quark.cn/s/72194e32428a AI学术工具公测链接:https://pan.baidu.com/s/104w_uBB2F42Da0qnk78_ew …...
使用黑森林实验室发布的Flux.1 文生图模型进行 UI 创作以及 PS 操作
我们前期介绍了黑森林实验室发布的 Flux.1 文生图大模型,其模型是一个扩散模型。扩散模型通过迭代细化噪声图像来生成最终图像。这种去噪过程使扩散模型能够创建更连贯、更逼真的图像,因为扩散是一个多步骤过程,这与 GAN(生成对抗…...
React Native 0.78新特性
此版本在 React Native 中发布了 React 19,以及其他相关功能,例如对 Android Vector drawables 的原生支持以及对 iOS 的更好的 Brownfield 集成。 亮点 React 19 React 19 现在可在 React Native 上使用!React 19 需要更新您的应用,因为我们从 React 18 引入了一些更改…...
11.24 SpringMVC(1)@RequestMapping、@RestController、@RequestParam
一.RequestMapping("/user")//HTTP 请求方法既支持get也支持post,可表示为类路径与方法路径 二.RequestMapping(value "/m7", method {RequestMethod.POST, RequestMethod.GET}) value这个参数指定了请求的 URL 路径。method 参数指定了允许…...
webstorm的Live Edit插件配合chrome扩展程序JetBrains IDE Support实现实时预览html效果
前言 我们平时在前端网页修改好代码要点击刷新再去看修改的效果,这样比较麻烦,那么很多软件都提供了实时预览的功能,我们一边编辑代码一边可以看到效果。下面说的是webstorm。 1 Live Edit 首先我们需要在webstorm的settings里安装插件Live …...
ROS环境搭建
ROS首次搭建环境 注:以下内容都是在已经安装好ros的情况下如何搭建workplace 一、创建工作空间二、创建ROS包三、注意 注:以下内容都是在已经安装好ros的情况下如何搭建workplace 如果没有安装好,建议鱼香ros一步到位:鱼香ROS 我也是装了好久…...
Cherry Studio + 火山引擎 构建个人AI智能知识库
🍉在信息化时代,个人知识库的构建对于提高工作效率、知识管理和信息提取尤为重要。尤其是当这些知识库能结合人工智能来智能化地整理、分类和管理数据时,效果更为显著。我最近尝试通过 Cherry Studio 和 火山引擎 来搭建个人智能知识库&#…...
Spring Boot 与 MyBatis 版本兼容性
初接触Spring Boot,本次使用Spring Boot版本为3.4.3,mybatis的起步依赖版本为3.0.0,在启动时报错,报错代码如下 org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name userMapper…...
《 C++ 点滴漫谈: 二十九 》风格 vs. C++ 风格:类型转换的对决与取舍
摘要 类型转换是 C 编程中的重要机制,用于在不同数据类型之间进行安全高效的转换。本博客系统介绍了 C 提供的四种类型转换运算符(static_cast、dynamic_cast、const_cast 和 reinterpret_cast)的用法及适用场景,分析了它们相较于…...
AI预测福彩3D新模型百十个定位预测+胆码预测+杀和尾+杀和值2025年3月3日第11弹
前面由于工作原因停更了很长时间,停更期间很多彩友一直私信我何时恢复发布每日预测,目前手头上的项目已经基本收尾,接下来恢复发布。当然,也有很多朋友一直咨询3D超级助手开发的进度,在这里统一回复下。 由于本人既精…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
