HarmonyOS 基础语法概述 UI范式

ArkUI框架 - UI范式

ArkTS的基本组成

ArkTS的基本组成

  • 装饰器:
    用于装饰类、结构、方法以及变量,并赋予其特殊的含义。如上述示例中@Entry、@Component和@State都是装饰器,@Component表示自定义组件,@Entry表示该自定义组件为入口组件,@State表示组件中的状态变量,状态变量变化会触发UI刷新。

  • UI描述:以声明式的方式来描述UI的结构,例如build()方法中的代码块。

  • 自定义组件:可复用的UI单元,可组合其他组件,如上述被@Component装饰的struct Hello。

  • 系统组件:ArkUI框架中默认内置的基础和容器组件,可直接被开发者调用,比如示例中的Column、Text、Divider、Button。

  • 属性方法:组件可以通过链式调用配置多项属性,如fontSize()、width()、height()、backgroundColor()等。

  • 事件方法:组件可以通过链式调用设置多个事件的响应逻辑,如跟随在Button后面的onClick()。

  • 系统组件、属性方法、事件方法具体使用可参考基于ArkTS的声明式开发范式。

除此之外,ArkTS扩展了多种语法范式来使开发更加便捷:

  • @Builder/@BuilderParam:特殊的封装UI描述的方法,细粒度的封装和复用UI描述。

  • @Extend/@Styles:扩展内置组件和封装属性样式,更灵活地组合内置组件。

  • stateStyles:多态样式,可以依据组件的内部状态的不同,设置不同样式。

创建自定义组件

自定义组件具有以下特点:

  • 可组合:允许开发者组合使用系统组件、及其属性和方法。
  • 可重用:自定义组件 可以被其他组件重用,并作为不同的实例在不同的父组件或容器中使用。
  • 数据驱动UI更新:通过状态变量的改变,来驱动UI的刷新。

自定义组件的基本用法


struct HelloComponent { message: string = 'Hello, World!';build() {// HelloComponent自定义组件组合系统组件Row和TextRow() {Text(this.message).onClick(() => {// 状态变量message的改变驱动UI刷新,UI从'Hello, World!'刷新为'Hello, ArkUI!'this.message = 'Hello, ArkUI!';})}}
}

注意
如果在另外的文件中引用该自定义组件,需要使用export关键字导出,并在使用的页面import该自定义组件。

HelloComponent可以在其他自定义组件中的build()函数中多次创建,实现自定义组件的重用。



struct ParentComponent {build() {Column() {Text('ArkUI message')HelloComponent({ message: 'Hello World!' });Divider()HelloComponent({ message: '你好,世界!' });}}
}

页面和自定义组件生命周期

自定义组件和页面的关系:

  • 自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期。
  • 页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才可以调用页面的生命周期。

页面生命周期,即被@Entry装饰的组件生命周期,提供以下生命周期接口:

  • onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。
  • onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
  • onBackPress:当用户点击返回按钮时触发。

组件生命周期,即一般用@Component装饰的自定义组件的生命周期,提供以下生命周期接口:

  • aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。

  • onDidBuild:组件build()函数执行完成之后回调该接口,开发者可以在这个阶段进行埋点数据上报等不影响实际UI的功能。不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的UI表现。

  • aboutToDisappear:aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

生命周期流程如下图所示,下图展示的是被@Entry装饰的组件(页面)生命周期。
被@Entry装饰的组件(页面)生命周期

循环渲染

ForEach接口基于数组类型数据来进行循环渲染,需要与容器组件配合使用

键值生成规则

在ForEach循环渲染过程中,系统会为每个数组元素生成一个唯一且持久的键值,用于标识对应的组件。当这个键值变化时,ArkUI框架将视为该数组元素已被替换或修改,并会基于新的键值创建一个新的组件。

ForEach提供了一个名为keyGenerator的参数,这是一个函数,开发者可以通过它自定义键值的生成规则。如果开发者没有定义keyGenerator函数,则ArkUI框架会使用默认的键值生成函数,即(item: Object, index: number) => { return index + ‘__’ + JSON.stringify(item); }。

ArkUI框架对于ForEach的键值生成有一套特定的判断规则,这主要与itemGenerator函数的第二个参数index以及keyGenerator函数的第二个参数index有关,具体的键值生成规则判断逻辑如下图所示。
ForEach键值生成规则

正确渲染并保证效率的ForEach写法是:

ForEach(this.simpleList, (item: string) => {ChildItem({ item: item })
}, (item: string) => item.id)  // 需要保证key唯一

示例:在文章列表卡片上点击“点赞”按钮,从而修改文章的点赞数量。
Article类被@Observed装饰器修饰。父组件ArticleListView传入Article对象实例给子组件ArticleCard,子组件使用@ObjectLink装饰器接收该实例。

当点击第1个文章卡片上的点赞图标时,会触发ArticleCard组件的handleLiked函数。
该函数修改第1个卡片对应组件里article实例的isLiked和likesCount属性值。
article实例是@ObjectLink装饰的状态变量,它的属性值变化,触发对应的ArticleCard组件渲染,读取到的isLiked和likesCount为修改后的新值。


class Article {id: string;title: string;brief: string;isLiked: boolean;likesCount: number;constructor(id: string, title: string, brief: string, isLiked: boolean, likesCount: number) {this.id = id;this.title = title;this.brief = brief;this.isLiked = isLiked;this.likesCount = likesCount;}
}

struct ArticleListView { articleList: Array<Article> = [new Article('001', '第0篇文章', '文章简介内容', false, 100),new Article('002', '第1篇文章', '文章简介内容', false, 100),new Article('003', '第2篇文章', '文章简介内容', false, 100),new Article('004', '第4篇文章', '文章简介内容', false, 100),new Article('005', '第5篇文章', '文章简介内容', false, 100),new Article('006', '第6篇文章', '文章简介内容', false, 100),];build() {List() {ForEach(this.articleList, (item: Article) => {ListItem() {ArticleCard({article: item}).margin({ top: 20 })}}, (item: Article) => item.id)}.padding(20).scrollBar(BarState.Off).backgroundColor(0xF1F3F5)}
}
struct ArticleCard { article: Article;handleLiked() {this.article.isLiked = !this.article.isLiked;this.article.likesCount = this.article.isLiked ? this.article.likesCount + 1 : this.article.likesCount - 1;}build() {Row() {// 此处'app.media.icon'仅作示例,请开发者自行替换,否则imageSource创建失败会导致后续无法正常执行。Image($r('app.media.icon')).width(80).height(80).margin({ right: 20 })Column() {Text(this.article.title).fontSize(20).margin({ bottom: 8 })Text(this.article.brief).fontSize(16).fontColor(Color.Gray).margin({ bottom: 8 })Row() {// 此处app.media.iconLiked','app.media.iconUnLiked'仅作示例,请开发者自行替换,否则imageSource创建失败会导致后续无法正常执行。Image(this.article.isLiked ? $r('app.media.iconLiked') : $r('app.media.iconUnLiked')).width(24).height(24).margin({ right: 8 })Text(this.article.likesCount.toString()).fontSize(16)}.onClick(() => this.handleLiked()).justifyContent(FlexAlign.Center)}.alignItems(HorizontalAlign.Start).width('80%').height('100%')}.padding(20).borderRadius(12).backgroundColor('#FFECECEC').height(120).width('100%').justifyContent(FlexAlign.SpaceBetween)}
}

上述代码的初始运行效果(左图)和点击第1个文章卡片上的点赞图标后的运行效果(右图)如下图所示。
数组项子属性变化案例运行效果图

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

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

相关文章

Docker镜像基本概念与构建指南

Docker镜像基本概念与构建指南 一、Docker镜像基本概念 Docker镜像是容器运行的基础&#xff0c;包含应用程序及其运行所需的文件系统、依赖库、环境变量和配置。其核心特性包括&#xff1a; 只读性&#xff1a;镜像本身不可修改&#xff0c;容器运行时在镜像层之上创建可写…

如何避免 CDN 缓存泄漏用户隐私数据

CDN 通过将内容缓存到全球各地的边缘服务器上,显著缩短了数据传输的物理距离,从而加速了内容的交付。然而,这一技术在提升性能的同时,也悄然埋下了一颗隐私隐患的种子——缓存数据可能被不当访问或泄漏,进而暴露用户的敏感信息。 目录 禁用对用户个人信息的缓存 仅缓存…

软考中级数据库系统工程师学习资料分享

软考中级数据库系统工程师考试对于很多 IT 从业者和计算机专业的大学生来说&#xff0c;是一个重要的职业资格认证。它不仅能够提升个人的专业技能&#xff0c;还能为职业发展增添有力的砝码。今天&#xff0c;我将为大家分享一套全面且实用的学习资料&#xff0c;帮助大家更好…

数据处理: 均值漂移聚类(Mean Shift)

一、 基本原理 Mean Shift是一种基于密度的非参数聚类算法&#xff0c;不需要预先指定簇的数量&#xff0c;而是通过寻找数据空间中密度最大的区域来自动确定聚类中心, 适合图像分割和目标跟踪等。 算法步骤 初始化&#xff1a;对每个数据点作为起点。 迭代&#xff1a;计算…

辛格迪客户案例 | 苏州富士莱医药GMP培训管理(TMS)项目

一、案例概述 富士莱医药股份有限公司位于美丽的江南水乡常熟&#xff0c;前身为常熟富士莱医药化工有限公司&#xff0c;从建厂初期面积仅有10余亩&#xff0c;逐步扩展到100余亩。近年来公司飞速发展&#xff0c;以黑马姿态发展成为中国专业生产硫辛酸系列产品、肌肽系列产品…

SQL注入相关知识

一、布尔盲注 1、布尔盲简介 布尔盲注是一种SQL注入攻击技术&#xff0c;用于在无法直接获取数据库查询结果的情况下&#xff0c;通过页面的响应来判断注入语句的真假&#xff0c;从而获取数据库中的敏感信息 2、布尔盲注工作原理 布尔盲注的核心在于利用SQL语句的布尔逻辑…

Linux基础学习--linux的文件权限与目录配置

linux的文件权限与目录配置 1.用户与用户组 在Linux中&#xff0c;每个文件都有相当多的属性和权限&#xff0c;其中最重要的概念就是文件的拥有者。 1.1 文件拥有者 Linux是一个多人多任务的系统&#xff0c;常常有多人共用一台主机的情况出现&#xff0c;因此在系统中可以…

【数据可视化-19】智能手机用户行为可视化分析

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个…

vue项目通过GetCapabilities获取wmts服务元数据信息并在openlayers进行叠加显示

vue项目通过openlayers加载wmts服务示例&#xff1a; <template><div id"map" ref"mapContainer"></div> </template><script> import ol/ol.css; import Map from ol/Map; import View from ol/View; import TileLayer fr…

JavaWeb学习打卡-Day1-分层解耦、Spring IOC、DI

三层架构 Controller&#xff08;控制层&#xff09;&#xff1a;接收前端发送的请求&#xff0c;对请求进行处理&#xff0c;并响应数据。Service&#xff08;业务逻辑层&#xff09;&#xff1a;处理具体的业务逻辑。DAO&#xff08;数据访问层/持久层&#xff09;&#xff…

【含文档+PPT+源码】基于Python爬虫二手房价格预测与可视化系统的设计与实现

项目介绍 本课程演示的是一款基于Python爬虫二手房价格预测与可视化系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项…

游戏引擎学习第229天

仓库:https://gitee.com/mrxiao_com/2d_game_5 回顾上次内容并介绍今天的主题 上次留下的是一个非常简单的任务&#xff0c;至少第一步是非常简单的。我们需要在渲染器中加入排序功能&#xff0c;这样我们的精灵&#xff08;sprites&#xff09;才能以正确的顺序显示。为此我…

【“星瑞” O6 评测】—NPU 部署 face parser 模型

前言 瑞莎星睿 O6 (Radxa Orion O6) 拥有高达 28.8TOPs NPU (Neural Processing Unit) 算力&#xff0c;支持 INT4 / INT8 / INT16 / FP16 / BF16 和 TF32 类型的加速。这里通过通过官方的工具链进行FaceParsingBiSeNet的部署 1. FaceParsingBiSeNet onnx 推理 首先从百度网盘…

单例模式的使用场景 以及 饿汉式写法(智能指针)

单例模式的使用场景 以及 饿汉式写法&#xff08;智能指针&#xff09; 饿汉式&#xff1a;创建类时就已经创建好了类的实例&#xff08;用智能指针实现&#xff09;什么时候用单例模式&#xff1a;1. 全局配置管理2. 日志系统3. 资源管理器4. 硬件设备访问总结 饿汉式&#xf…

微信小程序的全局变量(quanjubianliang)

在微信小程序开发中&#xff0c;管理和使用全局变量是一种常见的需求。例如&#xff0c;可以通过小程序的App实例和globalData对象来实现全局变量的存储和共享。以下是详细说明&#xff1a; 1. 全局变量的定义 微信小程序提供了 App() 函数&#xff0c;其中可以定义一个 global…

Latex科研入门教程

Introduction 这篇文章适合有markdown基础的人看,不会的人可以先去学一下markdown. 仅适用于科研入门. 本文使用的latex环境为overleaf Latex概况 文件格式 以.tex为结尾的文件可能有多个.tex文件最终只编译一个文件,相当于一个文件控制其他子文件. Latex 代码分为三种&…

FastGPT Docker Compose本地部署与硅基流动免费AI接口集成指南

本文参考&#xff1a;https://doc.tryfastgpt.ai/docs/development/ 一、背景与技术优势 FastGPT是基于LLM的知识库问答系统&#xff0c;支持自定义数据训练与多模型接入。硅基流动&#xff08;SiliconFlow&#xff09;作为AI基础设施平台&#xff0c;提供高性能大模型推理引…

19_大模型微调和训练之-基于LLamaFactory+LoRA微调LLama3

基于LLamaFactory微调_LLama3的LoRA微调 1. 基本概念1.1. LoRA微调的基本原理1.2. LoRA与QLoRA1.3. 什么是 GGUF 2.LLaMA-Factory介绍3. 实操3.1 实验环境3.2 基座模型3.3 安装 LLaMA-Factory 框架3.3.1 前置条件 3.4 数据准备3.5 微调和训练模型torch.cuda.OutOfMemoryError: …

Linux Wlan-四次握手(eapol)框架流程

协议基础 基于 IEEE 802.1X 标准实现的协议 抓包基础 使用上一章文章的TPLINK wn722n v1网卡在2.4G 频段抓包&#xff08;v2、v3是不支持混杂模式的&#xff09; eapol的四个交互流程 根据不同的认证模式不同&#xff0c;两者的Auth流程有所不同&#xff0c;但是握手流程基…

基于亚马逊云科技 Amazon Bedrock Tool Use 实现 Generative UI

背景 在当前 AI 应用开发浪潮中&#xff0c;越来越多的开发者专注于构建基于大语言模型&#xff08;LLM&#xff09;的 chatbot 和 AI Agent。然而&#xff0c;传统的纯文本对话形式存在局限性&#xff0c;无法为用户提供足够直观和丰富的交互体验。为了增强用户体验&#xff…