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

【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.dtcms.com/a/290568.html

相关文章:

  • 产品剖析之AI创作与协作的未来革新者Flowith
  • 【编程语言】C、C++、C#深度对比:三种语言的演进历程与应用场景
  • zabbix企业级分布式监控环境部署
  • Django关于ListView通用视图的理解(Cursor解释)
  • 牛客周赛 Round 101题解
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十六天
  • 阶段1--Linux中的网络配置
  • rt-thread多线程消息队列通信
  • 【SAP-CO】成本控制范围
  • 清理磁盘空间
  • 4 种更新的方法将消息从安卓传输到 Mac
  • JavaEE初阶第十期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(八)
  • 用 Three.js 实现 PlayCanvas 风格 PBR 材质教程(第二篇):核心参数与光照模型
  • CS课程项目设计4:支持AI人机对战的五子棋游戏
  • RustDesk自建服务器完整部署指南:从零开始到成功连接。成功解决rustdesk报错:未就绪,请检查网络连接
  • Linux的系统调用机制总结
  • [Python] -项目实战10- 用 Python 自动化批量重命名文件
  • 重学前端008 --- CSS 无障碍 Quiz
  • 《高并发优化方案一》:本地锁 + 分布式锁实战详解
  • Excel函数 —— TEXTJOIN 文本连接
  • 支持不限制大小,大文件分段批量上传功能(不受nginx /apache 上传大小限制)
  • Apache Ignite Closure 和 Thread Pool
  • Ubuntu安装k8s集群入门实践-v1.31
  • WinForm-免费,可商用的WinForm UI框架推荐
  • 类似腾讯会议的私有化音视频会议软件,BeeWorks Meet
  • Go语言进阶书籍:Go语言高级编程(第2版)
  • 开源 Arkts 鸿蒙应用 开发(八)多媒体--相册和相机
  • 45.sentinel自定义异常
  • RIQ模型时间管理方法详解
  • Idea或Pycharm上.idea的忽略提交的问题总结