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

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. 资源复用:复用组件和资源,减少内存占用

相关文章:

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

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

【NLP 30、文本匹配任务 —— 传统机器学习算法】

目录 一、文本匹配任务的定义 1.狭义解释 2.广义解释 二、文本匹配的应用 1.问答对话 2.信息检索 3.文本匹配任务应用 三、智能问答 1.智能问答的基本思路 依照基础资源划分&#xff1a; 依照答案产出方式划分 依照NLP相关技术划分 四、智能问答的价值 1.智能客服 2.Faq知识库问…...

爬虫Incapsula reese84加密案例:Etihad航空

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、找出需要加密的参数 1.js运行 atob(‘aHR0cHM6Ly93d3cuZXRpaGFkLmNvbS96aC1jbi8=’) 拿到网址,F12打开调试工具,随便搜索航班,切换到network搜索一个时间点可以找…...

【Vue教程】使用Vite快速搭建前端工程化项目 Vue3 Vite Node.js

??大家好&#xff01;我是毛毛张! ??个人首页&#xff1a; ??今天毛毛张分享的是关于如何快速??♂搭建一个前端工程化的项目的环境搭建以及流程?? 文章目录 1.前端工程化环境搭建?? 1.1 什么是前端工程化1.2 nodejs的简介和安装 1.2.1 什么是Nodejs1.2.2 如何安装…...

如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档

将飞书的多维表格与DeepSeek R1结合使用&#xff0c;就像为你的数据管理和分析之旅装上一台涡轮增压器。两者的合作&#xff0c;不仅仅在速度上让人耳目一新&#xff0c;更是将智能化分析带入了日常的工作场景。以下是它们如何相辅相成并改变我们工作方式的一些分享。 --- 在…...

算数操作符、赋值操作符、单目操作符、强制类型转换

一、算术操作符&#xff08;、 -、 *、 /、 %&#xff09; • - * / %操作符都是双⽬操作符,有**两个操作数**的符号就叫做双目操作符 10 4| || | 操作数1 操作数2// - % / * 以此类推•操作符也被叫做&#xff1a;运算符 1. 符号、符号 - 和 符号* •…...

为AI聊天工具添加一个知识系统 之133 详细设计之74通用编程语言 之4 架构及其核心

本篇继续讨论 通用编程语言。 说明&#xff1a;本阶段的所有讨论都是围绕这一主题展开的&#xff0c;但前面的讨论分成了三个大部分&#xff08;后面列出了这一段的讨论题目的归属关系&#xff09;-区别distinguish&#xff08;各别&#xff09;&#xff1a; 文化和习俗。知识…...

RNN实现精神分裂症患者诊断(pytorch)

RNN理论知识 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09; 是一种 专门用于处理序列数据&#xff08;如时间序列、文本、语音、视频等&#xff09;的神经网络。与普通的前馈神经网络&#xff08;如 MLP、CNN&#xff09;不同&#xff0c;RNN…...

私有云基础架构

基础配置 使用 VMWare Workstation 创建三台 2 CPU、8G内存、100 GB硬盘 的虚拟机 主机 IP 安装服务 web01 192.168.184.110 Apache、PHP database 192.168.184.111 MariaDB web02 192.168.184.112 Apache、PHP 由于 openEuler 22.09 系统已经停止维护了&#xff…...

rust学习笔记11-集合349. 两个数组的交集

rust除了结构体&#xff0c;还有集合类型&#xff0c;同样也很重要&#xff0c;常见的有数组&#xff08;Array&#xff09;、向量&#xff08;Vector&#xff09;、哈希表&#xff08;HashMap&#xff09; 和 集合&#xff08;HashSet&#xff09;字符串等&#xff0c;好意外呀…...

全栈(Java+vue)实习面试题(含答案)

在广州一个小公司&#xff08;BOSS标注是0-20人&#xff0c;薪资2-3k)&#xff0c;直接面试没有笔试&#xff0c;一开始就直接拿着简历问&#xff0c;也没有自我介绍&#xff0c;问题是结合场景题和八股文、基础。废话不多说&#xff0c;直接分享面试题目个大家做参考。 1、能…...

SQL经典常用查询语句

1. 基础查询语句 1.1 查询表中所有数据 在SQL中&#xff0c;查询表中所有数据是最基本的操作之一。通过使用SELECT * FROM table_name;语句&#xff0c;可以获取指定表中的所有记录和列。例如&#xff0c;假设有一个名为employees的表&#xff0c;包含员工的基本信息&#xf…...

超详细:数据库的基本架构

MySQL基础架构 下面这个图是我给出的一个MySQL基础架构图&#xff0c;可以清楚的了解到SQL语句在MySQL的各个模块进行执行过程。 然后MySQL可以分为两个部分&#xff0c;一个是server层&#xff0c;另一个是存储引擎。 server层 Server层涵盖了MySQL的大多数核心服务功能&am…...

AI催化新一轮创业潮与创富潮:深圳在抢跑

作者&#xff1a;尺度商业大掌柜黄利明 2025年春节伊始至今&#xff0c;从DeepSeek R1开源模型持续引发全球围观&#xff0c;到腾讯混元Turbo S模型发布秀出了"秒回"绝活&#xff0c;再到国务院发布《新一代人工智能发展规划&#xff08;2025-2030&#xff09;》重磅…...

Docker 深度解析:适合零基础用户的详解

此博客涵盖 Docker 的基本概念和作用、架构和核心组件、与传统虚拟机的对比、安装与基本操作&#xff0c;以及在实际开发和运维中的应用场景。 首先&#xff0c;详细解释了 Docker 的基本概念&#xff0c;包括它的诞生背景、作用及其如何解决传统应用部署中的问题。然后&#…...

SpringBoot生成唯一ID的方式

1.为什么要生成唯一ID&#xff1f; 数据唯一性&#xff1a;每个记录都需要有一个独一无二的标识符来确保数据的唯一性。这可以避免重复的数据行&#xff0c;并有助于准确地查询、更新或删除特定的记录。 数据完整性&#xff1a;通过使用唯一ID&#xff0c;可以保证数据库中的数…...

FastGPT 源码:RRF、Rerank 相关代码

文章目录 FastGPT 源码&#xff1a;RRF、Rerank 相关代码1. RRF (Reciprocal Rank Fusion) 合并实现2. Rerank 二次排序实现3. 重排序的主要特点4. 整个搜索流程5. 这种方式的优势 FastGPT 源码&#xff1a;RRF、Rerank 相关代码 下边介绍 RRF 合并和 Rerank 二次排序的相关实…...

Android视频流畅播放要素

要让 Android 设备流畅播放视频&#xff0c;需根据设备性能&#xff08;低端、中端、高端&#xff09;和播放场景&#xff08;本地播放、在线流媒体&#xff09;动态调整视频参数。以下是针对不同设备的推荐配置方案&#xff1a; 一、通用推荐配置&#xff08;平衡兼容性与流畅…...

Python:类型转换和深浅拷贝,可变与不可变对象

int()&#xff1a;转换为一个整数&#xff0c;只能转换由纯数字组成的字符串 浮点型强转整型会去掉小数点及后面的数&#xff0c;只保留整数部分 #如果字符串中有数字和正负号以外的字符就会报错 float()&#xff1a;整形转换为浮点型会自动添加一位小数 .0 如果字符串中有…...

vcredist_x64 资源文件分享

vcredist_x64 是 Microsoft Visual C Redistributable 的 64 位版本&#xff0c;用于在 64 位 Windows 系统上运行使用 Visual C 开发的应用程序。它包含了运行这些应用程序所需的运行时组件。 vcredist_x64 资源工具网盘下载链接&#xff1a;https://pan.quark.cn/s/ef56f838f…...

Linux:vim快捷键

Linux打开vim默认第一个模式是&#xff1a;命令模式&#xff01; 命令模式快捷键操作&#xff1a; gg&#xff1a;光标快速定位到最开始 shift g G&#xff1a;光标快速定位到最结尾 n shift g n G&#xff1a;光标快速定位到第n行 shift 6 ^&#xff1a;当前行开始 …...

DeepSeek在MATLAB上的部署与应用

在科技飞速发展的当下&#xff0c;人工智能与编程语言的融合不断拓展着创新边界。DeepSeek作为一款备受瞩目的大语言模型&#xff0c;其在自然语言处理领域展现出强大的能力。而MATLAB&#xff0c;作为科学计算和工程领域广泛应用的专业软件&#xff0c;拥有丰富的工具包和高效…...

NAT 代理服务 内网穿透

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; NAT 技术背景二&#xff1a;&#x1f525; NAT IP 转换过程三&#xff1a;&#x1f525; NAPT四&#xff1a;&#x1f525; 代理服务器&#x1f98b; 正向…...

高级课第五次作业

首先配置交换机&#xff0c;路由器 LSW1配置 [SW1]vlan batch 10 20 30 40 [SW1]int g0/0/2 [SW1-GigabitEthernet0/0/2]port link-type access [SW1-GigabitEthernet0/0/2]port default vlan 10 [SW1]int g0/0/3 [SW1-GigabitEthernet0/0/3]port link-type access […...

51单片机编程学习笔记——动态数码管显示多个数字

大纲 视觉残留原理生理基础神经传导与处理 应用与视觉暂留相关的现象 频闪融合不好的实现好的效果 延伸 在《51单片机编程学习笔记——动态数码管》一文中&#xff0c;我们看到如何使用动态数码管显示数字。但是基于动态数码管设计的特点&#xff0c;每次只能显示1个数字。这就…...

金蝶ERP星空对接流程

1.金蝶ERP星空OPENAPI地址&#xff1a; 金蝶云星空开放平台 2.下载金蝶云星空的对应SDK包 金蝶云星空开放平台 3.引入SDK流程步骤 引入Kingdee.CDP.WebApi.SDK 右键项目添加引用&#xff0c;在打开的引用管理器中选择浏览页签&#xff0c;点击浏览按钮&#xff0c;找到从官…...

【随手笔记】利尔达NB模组

1.名称 移芯EC6263GPP 参数 指令备注 利尔达上电输出 [2025-03-04 10:24:21.379] I_AT_WAIT:i_len2 [2025-03-04 10:24:21.724] LI_AT_WAIT:i_len16 [2025-03-04 10:24:21.724] [2025-03-04 10:24:21.733] Lierda [2025-03-04 10:24:21.733] [2025-03-04 10:24:21.745] OK移…...

Vue3的核心语法【未完】

Vue3的核心语法 OptionsAPI与CompositionAPI Options API&#xff08;选项式&#xff09; 和 Composition API &#xff08;组合式&#xff09;是 Vue.js 中用于构建组件的两种不同方式。Options API Options API Options API 是 Vue 2 中的传统模式&#xff0c;并在 Vue 3…...

解决redis lettuce连接池经常出现连接拒绝(Connection refused)问题

一.软件环境 windows10、11系统、springboot2.x、redis 6 7 linux&#xff08;centos&#xff09;系统没有出现这问题&#xff0c;如果你是linux系统碰到的&#xff0c;本文也有一定大参考价值。 根本思路就是&#xff1a;tcp/ip连接的保活(keepalive)。 二.问题描述 在spr…...

C#进阶指南

C# 是一种功能强大的编程语言,其高级语法特性为开发者提供了更灵活、高效和简洁的编程方式。以下是一些常见的 C# 高级语法特性: 1. 委托(Delegate) 委托是一种类型安全的函数指针,用于封装方法的引用。它可以将方法作为参数传递,实现回调机制。 定义委托: csharp复制 …...