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

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组件与布局基础组件响应式布局样式与主题 页面路由与参数传递页面跳转参数接收 数据绑定与循环渲染数据接口定义循环渲染 条件渲染组件生命周期最佳实践与性能优化组件复用响应式…...

【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法

【大厂AI实践】清华&#xff1a;清华古典诗歌自动生成系统“九歌”的算法 &#x1f31f; 嗨&#xff0c;你好&#xff0c;我是 青松 &#xff01; &#x1f308; 自小刺头深草里&#xff0c;而今渐觉出蓬蒿。 文章目录 **01 自动作诗缘起****1. 诗歌自动写作** **02 九歌的模型…...

JS基础之函数

函数使用 函数名命名规范 和变量命名基本一致> 尽量小驼峰式命名法 前缀应该为动词 命名建议:常用动词约定 动词含义can判断是否可执行某个动作has判断是否含义某个值is判断是否为某个值get获取某个值set设置某个值load加载某些数据 有返回值的函数 细节: 在函数体中使用…...

基于java SSM springboot学生信息管理系统设计和实现

基于java SSM springboot学生信息管理系统设计和实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 …...

【MongoDB】在Windows11下安装与使用

官网下载链接&#xff1a;Download MongoDB Community Server 官方参考文档&#xff1a;https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-windows/#std-label-install-mdb-community-windows 选择custom类型&#xff0c;其他默认 注意&#xff0c;此选…...

HTML在网页开发中的应用与重要性

## 摘要 HTML&#xff08;HyperText Markup Language&#xff09;是网页开发的基础语言之一&#xff0c;它定义了网页的结构和内容。随着互联网的快速发展&#xff0c;HTML不断演进&#xff0c;从HTML4到HTML5&#xff0c;其功能和特性得到了极大的增强。本文将探讨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…...

全面中耕机与行间中耕机的作用及区别

全面中耕机与行间中耕机的作用及区别 一、作用对比 全面中耕机 核心作用&#xff1a;主要用于整地前的土壤准备和休闲地管理&#xff0c;包括播前整地、土壤改良、化肥与化学药剂的混合等&#xff0c;为大面积种植创造均匀的种床环境。 附加功能&#xff1a;通过深耕&#xff…...

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独占一行&#xff0c;默认垂直布局&#xff0c;没有设置宽高时宽度继承父级…...

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使用手册」 链接&#xff1a;https://pan.quark.cn/s/98782f7d61dc 「清华大学Deepseek整理&#xff09; 1&#xff0d;6版本链接&#xff1a;https://pan.quark.cn/s/72194e32428a AI学术工具公测链接:https://pan.baidu.com/s/104w_uBB2F42Da0qnk78_ew …...

使用黑森林实验室发布的Flux.1 文生图模型进行 UI 创作以及 PS 操作

我们前期介绍了黑森林实验室发布的 Flux.1 文生图大模型&#xff0c;其模型是一个扩散模型。扩散模型通过迭代细化噪声图像来生成最终图像。这种去噪过程使扩散模型能够创建更连贯、更逼真的图像&#xff0c;因为扩散是一个多步骤过程&#xff0c;这与 GAN&#xff08;生成对抗…...

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&#xff0c;可表示为类路径与方法路径 二.RequestMapping(value "/m7", method {RequestMethod.POST, RequestMethod.GET}) value这个参数指定了请求的 URL 路径。method 参数指定了允许…...

webstorm的Live Edit插件配合chrome扩展程序JetBrains IDE Support实现实时预览html效果

前言 我们平时在前端网页修改好代码要点击刷新再去看修改的效果&#xff0c;这样比较麻烦&#xff0c;那么很多软件都提供了实时预览的功能&#xff0c;我们一边编辑代码一边可以看到效果。下面说的是webstorm。 1 Live Edit 首先我们需要在webstorm的settings里安装插件Live …...

ROS环境搭建

ROS首次搭建环境 注&#xff1a;以下内容都是在已经安装好ros的情况下如何搭建workplace 一、创建工作空间二、创建ROS包三、注意 注&#xff1a;以下内容都是在已经安装好ros的情况下如何搭建workplace 如果没有安装好&#xff0c;建议鱼香ros一步到位:鱼香ROS 我也是装了好久…...

Cherry Studio + 火山引擎 构建个人AI智能知识库

&#x1f349;在信息化时代&#xff0c;个人知识库的构建对于提高工作效率、知识管理和信息提取尤为重要。尤其是当这些知识库能结合人工智能来智能化地整理、分类和管理数据时&#xff0c;效果更为显著。我最近尝试通过 Cherry Studio 和 火山引擎 来搭建个人智能知识库&#…...

Spring Boot 与 MyBatis 版本兼容性

初接触Spring Boot&#xff0c;本次使用Spring Boot版本为3.4.3&#xff0c;mybatis的起步依赖版本为3.0.0&#xff0c;在启动时报错&#xff0c;报错代码如下 org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name userMapper…...

《 C++ 点滴漫谈: 二十九 》风格 vs. C++ 风格:类型转换的对决与取舍

摘要 类型转换是 C 编程中的重要机制&#xff0c;用于在不同数据类型之间进行安全高效的转换。本博客系统介绍了 C 提供的四种类型转换运算符&#xff08;static_cast、dynamic_cast、const_cast 和 reinterpret_cast&#xff09;的用法及适用场景&#xff0c;分析了它们相较于…...

AI预测福彩3D新模型百十个定位预测+胆码预测+杀和尾+杀和值2025年3月3日第11弹

前面由于工作原因停更了很长时间&#xff0c;停更期间很多彩友一直私信我何时恢复发布每日预测&#xff0c;目前手头上的项目已经基本收尾&#xff0c;接下来恢复发布。当然&#xff0c;也有很多朋友一直咨询3D超级助手开发的进度&#xff0c;在这里统一回复下。 由于本人既精…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...