【HarmonyOS】ArkUI - 声明式开发范式

一、UI 开发框架

在 HarmonyOS 开发中,官方主要推出了两种开发框架,一个是基于 Java 的,一个是基于 ArkTS 的。

  • 基于 Java:应用中所有用户界面元素都由基础组件 Component 和组件容器 ComponentContainer 对象构成。
  • 基于 ArkTS:包括组件和页面,组件时页面搭建的最小单位,通过组建的组合构建界面,页面 Page 是框架的最小调度分割单位,可以有多个功能页面,再通过 路由API 进行页面跳转和统一管理。

而后,基于 ArkTS 的 UI 开发,出现了两种开发范式,一种是基于 JS 的类 Web 开发范式和基于 eTS 的声明式开发范式,后变为基于 ArkTS 的声明式开发范式。

  • 基于 JS 的类 Web 开发范式:传统三件套
  • 基于 ArkTS 的声明式开发范式:采用 TS 语言,进行声明式 UI 语法扩展,从组件,状态管理和动效三个维度提供绘制能力。

二、声明式开发范式

在鸿蒙操作系统(HarmonyOS)中,声明式开发范式是一种以 “描述 UI 应该是什么样子” 为核心的开发模式,与传统的 “命令式开发范式”(通过代码一步步操作 UI 状态变化)形成对比。它更贴近自然语言的逻辑,让开发者聚焦于 UI 的结构和交互规则,而非具体的实现步骤。

基于ArkTS的声明式开发范式的方舟开发框架是一套开发极简、高性能、支持跨设备的UI开发框架,提供了构建应用UI所必需的能力。

  • ArkTS 语言:TS 的超集,包含 TS 所有特性,扩展了声明式UI、状态管理等。
  • **布局:**定义了组件在界面中的位置。有线性布局、层叠布局等
  • 组件:组件是UI的必要元素,形成了在界面中的样子,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件
  • **页面路由和组件导航:**应用可能包含多个页面,可通过页面路由实现页面间的跳转。一个页面内可能存在组件间的导航如典型的分栏,可通过导航组件实现组件间的导航。
  • **动画:**动画是UI的重要元素之一。组件内置动画效果外,还包括属性动画、显式动画、自定义转场动画以及动画API等。
  • **交互事件:**交互事件是UI和用户交互的必要元素。触摸事件、鼠标事件等。
  • **自定义能力:**自定义能力是UI开发框架提供给开发者对UI界面进行开发和定制化的能力。

1、声明式开发范式的核心特点

  1. 关注 “结果” 而非 “过程” 开发者只需通过代码描述 UI 的最终形态(如布局、样式、数据绑定关系),系统会自动处理从数据到 UI 的映射逻辑,以及 UI 的更新过程。 例如:若要展示一个列表,只需声明 “列表项由数组items渲染,每个项显示item.name”,无需手动编写 “循环创建控件、添加到容器” 的命令式代码。
  2. 数据驱动 UI 当数据发生变化时,系统会自动对比前后数据差异,只更新受影响的 UI 部分(即 “差分更新”),无需 JS Framework手动操作 DOM 或控件状态。 这种机制大幅减少了 “数据 - UI 同步” 的代码量,降低了出错概率。
  3. 声明式语法 鸿蒙的声明式开发主要通过ArkTS 语言实现,其语法简洁直观,支持类似 HTML 的标签式写法和数据绑定表达式。例如:
// 声明一个包含文本和按钮的组件
@Component
struct HelloComponent {@State count: number = 0; // 声明状态变量build() {Column() { // 声明垂直布局容器Text(`点击次数: ${this.count}`) // 文本与状态绑定.fontSize(20)Button('点击我') // 声明按钮.onClick(() => { this.count++ }) // 绑定点击事件,修改状态}}
}

2、与命令式开发的对比

维度命令式开发声明式开发(鸿蒙)
核心逻辑手动编写 “创建 - 修改 - 删除” UI 的步骤描述 UI 的结构、数据关系和交互规则
数据与 UI 同步需要手动监听数据变化并更新 UI(易出错)系统自动同步,数据变则 UI 变
代码复杂度随 UI 复杂度上升而急剧增加复杂度更平缓,聚焦业务逻辑
可读性需跟踪代码执行流程才能理解 UI 最终形态直观易懂,代码即 UI 结构描述

3、整体架构

在这里插入图片描述

  1. 应用层(最上层)

用户直接交互的应用程序。开发者基于鸿蒙的声明式 UI 框架编写应用,例如天气 App、计算器 App 等。

  1. 声明式 UI 前端

提供UI开发范式的基础语言规范,,并提供了内置的UI组件,布局和动画,多种状态管理机制,一系列接口。

  1. 语言运行时

提供针对UI范式语法的解析能力,跨语言调用支持能力和TS高性能运行环境。

  1. 声明式 UI 后端引擎

提供了兼容不同开发范式的UI渲染管线,多种基础组件,布局计算,动效,交互事件

  1. 渲染引擎

高效的绘制能力

  1. 平台适配层

提供了对系统平台的抽象接口,具备介入不同系统的能力。

  1. OS(最底层)
  • 作用:操作系统内核,提供基础服务。
  • 说明:例如进程管理、内存管理、驱动程序等。

三、基于 ArkUI 的项目

1、鸿蒙声明式开发范式(ArkUI)

声明式开发的核心是:通过描述 UI 的结构和状态,让框架自动处理渲染逻辑,开发者无需手动操作 DOM 或组件更新。

@Entry
@Component
struct CounterPage {// 声明状态变量(数据驱动UI)@State count: number = 0;build() {// 声明UI结构(描述“是什么”)Column() {Text(`当前计数:${this.count}`)  // 文本组件,绑定count状态.fontSize(20).margin(10)Button('点击加1')  // 按钮组件.onClick(() => {this.count++;  // 只修改状态,UI自动更新}).backgroundColor('#007DFF').fontColor('#FFFFFF')}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}

声明式特点:

  1. 状态驱动:@State 装饰的 count 变化时,框架自动更新依赖它的 Text 组件。
  2. 结构直观:通过嵌套组件(Column 包含 TextButton)描述 UI 层次,类似 HTML 的结构但更简洁。
  3. 无需手动操作:不需要像命令式那样调用 setText()setOnClickListener() 等方法。

2、文件结构

在应用的目录结构中, ets 目录下的文件一般以 .ets 结尾的是 ArkTS 文件, ets 是 extended TypeScript 的缩写, ets 文件一般用于描述 UI 布局、样式、事件交互和页面逻辑等。以. ts 为扩展名的文件为 TypeScript 文件。

在 ets 目录下,可以包含多个子目录,一般一个子目录用于实现一个 Ability 。在基于 Stage 模型的开发中, Ability 和 Pages 存放在该目录下,每个 Ability 对应一个文件夹,其下对应一个 Ability 的 ts 实现文件。

资源目录 resources 文件夹位于 src / main 下,应用的资源文件(字符串、图片、音频等)统一存放于 resources 目录下,便于开发者使用和维护。 resources 目录包括三大类目录,一类为 base 目录,一类为限定词目录,另一类为 rawfile 目录。

四、声明式语法

1、UI 描述规范

基于 ArkTS 的声明式开发方式创建的应用,在 Stage 模型下,由 UIAbility 负责 UI 界面,每个 UIAbility 有一 windowstage 负责窗口管理,窗口负责显示页面( Page ),每个页面的内部可以包含多个组件,其中必须有且只有一个入口( Entry )组件,组件内部可以嵌套其他组件。

在这里插入图片描述

因此,无论是 FA 模型还是 Stage 模型,一个页面( Page )对应一个 ETS 文件,一个页面内可以有若干个组件,基于 ArkTS 语言定义组件采用 struct 关键字,并通过生成器函数( build ())构建组件内的内容,组件内可以包含其他组件,其他组件可以是系统的内置组件,也可以是自定义的组件。一个页面必须有且只有一个入口组件,入口组件由@ Entry 装饰器修饰。构建一个页面的基本代码如下:

@ Entry 
//入口装饰器
@ Component 
//组件装饰器struct MyIndexComponent {
@ State mydata : string =''
//状态数据build (){
//生成器函数
//省略了构造内部组件}
}
@ Componentstruct OtherComponent {
@ State msg : string =build (){
//构造内部组件}
}

在生成器方法内构建的界面组件组成一棵树形结构,组件包括容器和普通组件,容器可以认为是特殊的组件,其内部可以放置别的组件或容器,容器组件也称为布局,普通组件一般不能包含其他组件。

在这里插入图片描述

2、组件化

由装饰器@Component装饰的struct结构体具备了组件化能力,是一个独立的组件,这种组件也称为自定义组件,自定义组件在其生成器build方法里进行UI结构描述,使其具有丰富的界面展示。

(1)可组合:自定义可以由其他组件组合而成,允许开发者在自定义组件内使用内置组件、其他组件、公共属性和方法等。

(2)可重用:自定义组件可以被其他组件使用,作为别的组件的一部分,并且可以重用,可以作为不同的实例在不同的父组件或容器中使用。

(3)数据驱动更新:自定义组件由状态变量的数据驱动,可以实现UI自动刷新。

(4)生命周期:自定义组件具有生命周期,具有相应的回调方法,开发者可以重写回调方法以实现组件自身的业务功能和逻辑。

(5)生成器方法:自定义组件必须定义生成器build方法,该方法用于构建组件内容。(6)无构造函数:自定义组件不能定义构造函数,组件内容的初始化构造是通过build完成的。

@component
struct OC {build(){Column() {MC() // 实例化自定义组件Text('adf') // 使用系统组件MC()}}
}

组件的结构重用可以看这里:【HarmonyOS】ArkUI - 自定义组件和组件扩展

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

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

相关文章

Python 绘制各类折线图全指南:从基础到进阶

折线图是数据可视化中最常用的图表类型之一,适用于展示数据随时间或有序类别变化的趋势。无论是分析销售额波动、温度变化,还是对比多组数据的趋势差异,折线图都能直观呈现数据的变化规律。本文将详细介绍如何用 Python 的 Matplotlib、Seabo…

MySql 运维性能优化

内存相关配置 innodb_buffer_pool_size:这是 InnoDB 存储引擎最重要的参数,用于缓存数据和索引。建议设置为服务器可用内存的 50%-70%(对于专用数据库服务器)。 innodb_buffer_pool_size 8G # 根据服务器内存调整innodb_log_buf…

UG 图形操作-找圆心

【1】点击分析-测量【2】 选择点,点对话框【3】选择圆弧中心【4】 选择对象

Spring Boot 配置文件解析

一、前言SpringBoot 使用一个全局的配置文件,配置文件名固定的;application.propertiesapplication.yml配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;YAML(YAML Ain…

【JS】事件类型(可addEventListener监听)

文章目录1. 窗口/视图相关事件2. 鼠标事件3. 键盘事件4. 焦点事件5. 表单事件6. 触摸事件(移动端)7. 其他重要事件使用示例 // 监听滚动事件 useEffect(() > {const handleScroll () > {console.log("当前滚动位置:", window.scrollY);…

【3GPP】5G专用词汇1

〇、在5G通信领域,类似RRU(远端射频单元)、UE(用户终端)、BS(基站)的专业术语非常丰富,涵盖设备、功能、架构、技术等多个层面。以下是分类整理的常见5G名词及其说明: 一…

基于 FFT + VMD 预处理的 1DCNN‑Informer 双支路并行、多头注意力融合分类模型

1  引言 现代工业设备的运行状态高度复杂、故障类型日趋多样,单一特征处理或单一路径模型常难以兼顾高精度与实时性。本期推出的模型**“FFT+VMD→1DCNN‑Informer→多头注意力”**流水线,将频域分解与时序建模结合,通过双支路并行特征提取和注意力融合,在旋转机械、电力…

ndarray的创建(小白五分钟从入门到精通)

ndarray的创建用途方法语法示例核心作用输出示例基础构造▪ 从 Python 数据结构创建np.array()np.array([[1, 2], [3, 4]])将列表/元组转换为 ndarrayarray([[1, 2], [3, 4]])▪ 复制数组np.copy()np.copy(arr)创建独立副本(深拷贝)与原数组相同但不共享…

考研数据结构Part1——单链表知识点总结

一、前言单链表是线性表的链式存储结构,作为数据结构中最基础也是最重要的线性结构之一,在考研数据结构科目中占有重要地位。本文将总结带头结点单链表的各项基本操作,包括初始化、插入、删除、查找等,并附上完整C语言实现代码&am…

笔试——Day15

文章目录第一题题目思路代码第二题题目:思路代码第三题题目:思路代码第一题 题目 平方数 思路 判断⼀个数开根号之后左右两个数的平⽅,哪个最近即可 代码 第二题 题目: 分组 思路 枚举所有的结果,找到第一个复合要…

物联网全流程开发记录

问题 有数据采集设备,服务器,上位机用户显示三部分,采集设备将采集的数据发送至服务器。服务器将数据保存,上位机读取服务器保存的数据库显示。当出现多设备,多用户时,如何通过多设备对应多用户&#xff0c…

【LeetCode 热题 100】46. 全排列——回溯

Problem: 46. 全排列 文章目录整体思路完整代码时空复杂度时间复杂度:O(N * N!)空间复杂度:O(N)整体思路 这段代码旨在解决一个经典的组合数学问题:全排列 (Permutations)。给定一个不含重复数字的数组 nums,它需要找出其所有可能…

AXI接口学习

amba总线的发展axi协议是两个接口之间的点对点的协议,主要是有5个通道。主机在写地址(AW)通道上发送地址,并在写数据(W)通道上将数据传输到从机。从机将接收到的数据写入指定地址空间。从机完成写操作&…

Validation - Spring Boot项目中参数检验的利器

Validation - Spring Boot项目中参数检验的利器 什么是Validation Sping Boot官方原文:When it comes to validating user input, Spring Boot provides strong support for this common, yet critical, task straight out of the box.Although Spring Boot support…

云服务器VS虚拟主机:如何抉择?

开篇引入在当今数字化浪潮中,无论是个人站长想要搭建独具风格的博客,展示自己的生活感悟与专业见解;还是中小企业期望构建官方网站,拓展线上业务版图,提升品牌知名度;亦或是大型互联网企业筹备高并发的电商…

不同相机CMOS噪点对荧光计算的影响

摘要:荧光成像是生物医学、材料科学等领域的重要研究手段,其成像质量高度依赖传感器噪声特性。本文系统分析CMOS传感器噪声类型及其对荧光信号计算的影响机制,结合实验数据探讨不同CMOS架构的噪声表现差异,提出针对性优化策略。研…

docker 常见命令使用记录

1. swarm 集群 1. 集群创建 # 创建集群管理节点, --advertise-addr 指定节点管理通信地址,--data-path-addr 指定容器通信地址 docker swarm init --advertise-addr 1.14.138.35 --data-path-addr 1.14.138.35# --advertise-addr 指明当前work节点的…

KRaft 角色状态设计模式:从状态理解 Raft

这些状态类是 Raft 协议行为的核心载体。它们包含转移逻辑 和 节点在特定状态下的所有行为和数据。QuorumState它是 KRaft 客户端实现中状态管理的核心,扮演着“状态机上下文(Context)”和“状态转换协调者”的关键角色。QuorumState 是整个 …

Linux的磁盘存储管理实操——(上)

一、Linux的设备文件分类 Linux的设备文件分类1、在Linux系统中设备文件是用来与外接交互的接口,它将内核中的硬件设备与文件系统关联起来,让用户可以像操作普通文件一样来操作硬件设备,同时也为开发者提供了方便而强大的应用程序接口。 2、L…

内核bpf的实现原理

bpftrace能帮我们干什么?1、统计 tcp连接的生命时长、2、统计mysql执行一条sql语句的时间3、统计redis执行命令的时间、 4、对文件进行一次读或者写的时间。 常用命令: bpftrace -e Begin { printf("hello\n"); } bpftrace -l *enter_accep…