ArkTS开发实践

news2025/1/13 7:41:06

声明式UI基本概念

应用界面是由一个个页面组成,ArkTS是由ArkUI框架提供,用于以声明式开发范式开发界面的语言。

声明式UI构建页面的过程,其实是组合组件的过程,声明式UI的思想,主要体现在两个方面:

  • 描述UI的呈现结果,而不关心过程
  • 状态驱动视图更新

类似苹果的SwiftUI中通过组合视图View,安卓Jetpack Compose中通过组合@Composable函数,ArkUI作为HarmonyOS应用开发的UI开发框架,其使用ArkTS语言构建自定义组件,通过组合自定义组件完成页面的构建。

自定义组件的组成

ArkTS通过struct声明组件名,并通过@Component和@Entry装饰器,来构成一个自定义组件。

使用@Entry和@Component装饰的自定义组件作为页面的入口,会在页面加载时首先进行渲染。

@Entry
@Component
struct ToDoList {...}

例如ToDoList组件对应如下整个代办页面。

图1 ToDoList待办列表

使用@Component装饰的自定义组件,如ToDoItem这个自定义组件则对应如下内容,作为页面的组成部分。

@Component
struct ToDoItem {...}

图2 ToDoItem

在自定义组件内需要使用build方法来进行UI描述。

@Entry
@Component
 struct ToDoList
   ...
   build() {
    ...
  } 
}

build方法内可以容纳内置组件和其他自定义组件,如Column和Text都是内置组件,由ArkUI框架提供,ToDoItem为自定义组件,需要开发者使用ArkTS自行声明。

@Entry
@Component
struct ToDoList {
  ...
  build() {
    Column(...) {
      Text(...)
        ...
      ForEach(...{
        TodoItem(...)
      },...)
    }
  ...
  }
}

配置属性与布局

自定义组件的组成使用基础组件和容器组件等内置组件进行组合。但有时内置组件的样式并不能满足我们的需求,ArkTS提供了属性方法用于描述界面的样式。属性方法支持以下使用方式:

  • 常量传递例如使用fontSize(50)来配置字体大小。
    Text('Hello World')
      .fontSize(50)
  • 变量传递在组件内定义了相应的变量后,例如组件内部成员变量size,就可以使用this.size方式使用该变量。
    Text('Hello World')
      .fontSize(this.size)
      .width(100)
      .height(100)
  • 链式调用在配置多个属性时,ArkTS提供了链式调用的方式,通过'.'方式连续配置。
    Text('Hello World')
      .fontSize(this.size)
      .width(this.count + 100)
      .height(this.count % 2 === 0 ? 100 : 200)
  • 表达式传递属性中还可以传入普通表达式以及三目运算表达式。
    Text('Hello World')
      .fontSize(this.size)
      .width(this.count + 100)
      .height(this.count % 2 === 0 ? 100 : 200)
  • 内置枚举类型除此之外,ArkTS中还提供了内置枚举类型,如Color,FontWeight等,例如设置fontColor改变字体颜色为红色,并私有fontWeight为加粗。
    Text('Hello World')
      .fontSize(this.size)
      .width(this.count + 100)
      .height(this.count % 2 === 0 ? 100 : 200)
      .fontColor(Color.Red)
      .fontWeight(FontWeight.Bold)

对于有多种组件需要进行组合时,容器组件则是描述了这些组件应该如何排列的结果。

ArkUI中的布局容器有很多种,在不同的适用场合选择不同的布局容器实现,ArkTS使用容器组件采用花括号语法,内部放置UI描述。

这里我们将介绍最基础的两个布局——列布局和行布局。

对于如下每一项的布局,两个元素为横向排列,选择Row布局

图3 Row布局

Row() {
  Image($r('app.media.ic_default'))
    ...
  Text(this.content) 
    ...
}
...

类似下图所示的布局,整体都是从上往下纵向排列,适用的布局方式是Column列布局。

图4 Column布局

Column() {
   Text($r('app.string.page_title'))
     ...

   ForEach(this.totalTasks,(item) => {
     TodoItem({content:item})
   },...)
 }

改变组件状态

实际开发中由于交互,页面的内容可能需要产生变化,以每一个ToDoItem为例,其在完成时的状态与未完成时的展示效果是不一样的。

图5 不同状态的视图

声明式UI的特点就是UI是随数据更改而自动刷新的,我们这里定义了一个类型为boolean的变量isComplete,其被@State装饰后,框架内建立了数据和视图之间的绑定,其值的改变影响UI的显示。

@State isComplete : boolean = false;

图6 @State装饰器的作用

用圆圈和对勾这样两个图片,分别来表示该项是否完成,这部分涉及到内容的切换,需要使用条件渲染if / else语法来进行组件的显示与消失,当判断条件为真时,组件为已完成的状态,反之则为未完成。

if (this.isComplete) {
  Image($r('app.media.ic_ok'))
    .objectFit(ImageFit.Contain)
    .width($r('app.float.checkbox_width'))
    .height($r('app.float.checkbox_width'))
    .margin($r('app.float.checkbox_margin'))
} else {
  Image($r('app.media.ic_default'))
    .objectFit(ImageFit.Contain)
    .width($r('app.float.checkbox_width'))
    .height($r('app.float.checkbox_width'))
    .margin($r('app.float.checkbox_margin'))
}

由于两个Image的实现具有大量重复代码,ArkTS提供了@Builder装饰器,来修饰一个函数,快速生成布局内容,从而可以避免重复的UI描述内容。这里使用@Bulider声明了一个labelIcon的函数,参数为url,对应要传给Image的图片路径。

@Builder labelIcon(url) {
  Image(url)
    .objectFit(ImageFit.Contain)
    .width($r('app.float.checkbox_width'))
    .height($r('app.float.checkbox_width'))
    .margin($r('app.float.checkbox_margin'))
}

使用时只需要使用this关键字访问@Builder装饰的函数名,即可快速创建布局。

if (this.isComplete) {
  this.labelIcon($r('app.media.ic_ok'))
} else {
  this.labelIcon($r('app.media.ic_default'))
}

为了让待办项带给用户的体验更符合已完成的效果,给内容的字体也增加了相应的样式变化,这里使用了三目运算符来根据状态变化修改其透明度和文字样式,如opacity是控制透明度,decoration是文字是否有划线。通过isComplete的值来控制其变化。

Text(this.content)
  ...
  .opacity(this.isComplete ? CommonConstants.OPACITY_COMPLETED : CommonConstants.OPACITY_DEFAULT)
  .decoration({ type: this.isComplete ? TextDecorationType.LineThrough : TextDecorationType.None })

最后,为了实现与用户交互的效果,在组件上添加了onClick点击事件,当用户点击该待办项时,数据isComplete的更改就能够触发UI的更新。

@Component
struct ToDoItem {
  @State isComplete : boolean = false;
  @Builder labelIcon(icon) {...}
  ...
  build() {
    Row() {
      if (this.isComplete) {
        this.labelIcon($r('app.media.ic_ok'))
      } else {
        this.labelIcon($r('app.media.ic_default'))
      }
      ... 
    }
    ...
    .onClick(() => {
      this.isComplete= !this.isComplete;
     })
  }
}

循环渲染列表数据

刚刚只是完成了一个ToDoItem组件的开发,当我们有多条待办数据需要显示在页面时,就需要使用到ForEach循环渲染语法。

例如这里我们有五条待办数据需要展示在页面上。

total_Tasks:Array<string> = [
  '早起晨练',
  '准备早餐',
  '阅读名著',
  '学习ArkTS',
  '看剧放松'
]

ForEach基本使用中,只需要了解要渲染的数据以及要生成的UI内容两个部分,例如这里要渲染的数组为以上的五条待办事项,要渲染的内容是ToDoItem这个自定义组件,也可以是其他内置组件。

图7 ForEach基本使用

ToDoItem这个自定义组件中,每一个ToDoItem要显示的文本参数content需要外部传入,参数传递使用花括号的形式,用content接受数组内的内容项item。

最终完成的代码及其效果如下。

@Entry
@Component
struct ToDoList {
   ...
   build() {
     Row() {
       Column() {
         Text(...)
           ...
         ForEach(this.totalTasks,(item) => {
           TodoItem({content:item})
         },...)
       }
       .width('100%')
     }
     .height('100%')
   }
 }

图8 ToDoList页面

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

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

相关文章

基于PHP的毕业生招聘管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

吃鸡战队都爱!KOTIN京天华盛定制主机值得拥有

开学季大促正在进行时&#xff0c;少不了来自KOTIN京天的关爱&#xff01;称心满意的初秋&#xff0c;就来京天华盛官方旗舰店挑选一台心仪已久的电脑吧。准备入学的校友们和走过路过的游戏爱好者可千万不能错过了。 作为定制游戏电脑的行业佼佼者&#xff0c;KOTIN京天在各个价…

Android12之DRM架构(一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

视频太大怎么压缩变小?三分钟学会视频压缩

随着科技的不断发展&#xff0c;视频已经成为了我们日常生活中不可或缺的一部分&#xff0c;然而&#xff0c;大尺寸的视频文件常常会给我们带来诸多困扰&#xff0c;例如发送不便、存储空间不足等等&#xff0c;那么&#xff0c;如何将这些过大的视频文件压缩变小呢&#xff1…

公司如何防止源代码外泄,保护开发部门代码安全呢?

在智能制造业中&#xff0c;研发人员的开发环境&#xff0c;大多数采用c#开发语言svn 或c#git进行软件系统的开发&#xff0c;但是c#语言如何来防泄密保护呢&#xff1f;德人合科技针对于制造类企业制定了安全稳定的源代码防泄密方案&#xff0c;不影响员工的正常工作&#xff…

Vivado详细使用教程 | LED闪烁示例

文章目录 整体流程第一步&#xff1a;新建工程第二步&#xff1a;设计输入第三步&#xff1a;功能仿真第四步&#xff1a;分析与综合第五步&#xff1a;约束输入第六步&#xff1a;设计实现第七步&#xff1a;下载比特流 整体流程 打开软甲------>新建工程------->设计输…

0145 输入/输出(I/O)管理

目录 5.输入/输出&#xff08;I/O&#xff09;管理 5.1I/O管理概述 5.2设备独立性软件 5.3磁盘和固态硬盘 部分习题 5.输入/输出&#xff08;I/O&#xff09;管理 5.1I/O管理概述 5.2设备独立性软件 5.3磁盘和固态硬盘 部分习题 1.虚拟设备是指&#xff08;&#xff09;…

C语言从入门到高级

C语言是“编程语言之首”&#xff08;很多人学习的第一门编程语言&#xff09;&#xff0c;学好一门编程语言需要明确其学习路径&#xff0c;下面分享下我的学习路径&#xff0c;希望对您有所帮助。 一、C语言入门 &#xff08;1&#xff09;C语言概述 &#xff08;2&#x…

tomcat动静分离

1.七层代理动静分离 nginx代理服务器&#xff1a;192.168.233.61 代理又是静态 tomcat1:192.168.233.71 tomcat2:192.168.233.72 全部关闭防火墙 在http模块里面 tomcat1&#xff0c;2 删除上面的hostname 148 配置 直接访问 http://192.168.66.17/index.jsp 2.四层七层动…

太好上手了!10款常用的可视化工具你一定要知道!

当谈到可视化工具时&#xff0c;有许多常用的工具可供选择。这些工具可以帮助我们将数据转化为易于理解和具有视觉吸引力的图表、图形和仪表板。 以下是10款常用的可视化工具&#xff0c;它们在不同领域和用途中广泛使用。 1. Datainside&#xff1a; Datainside是一款功能强…

在线课堂小程序源码系统+在线考试+在线刷题三合一 带完整搭建教程

目前&#xff0c;教育行业也逐渐向数字化和智能化转型。而在线课堂在线考试在线刷题三合一小程序源码系统集课程学习、考试测验和在线刷题于一体&#xff0c;具有方便快捷、准确高效和使用体验好的优点。对于学校和教育机构来说&#xff0c;这款系统可以有效提升教学质量和效率…

聊聊分布式架构07-[Spring]IoC和AOP

目录 Spring IoC IoC的设计与实现 简单容器BeanFactory 高级容器ApplicationContext IoC容器工作过程 Spring AOP 简单的Spring AOP示例 Spring IoC IoC&#xff08;Inversion of Control&#xff09;&#xff1a; IoC是一种设计原则&#xff0c;它反转了传统的控制流。…

mysql select语句中from 之后跟查询语句

概念&#xff1a;将from后面的查询语句放在FROM的后面&#xff0c;则查询到的结果&#xff0c;就会被当成一个“表”; 这里有一个特别要注意的地方&#xff0c;放在FROM后面的子查询&#xff0c;必须要加别名。 select dui.id,dui.party_service_id mes_id, dui.party_id,dui.…

精彩回顾|【ACDU 中国行·成都站】数据库主题交流活动成功举办!

2023年10月14日下午&#xff0c;【ACDU 中国行成都站】在成都市武侯区星宸假日酒店圆满落下帷幕。本次活动由中国数据库联盟&#xff08;ACDU&#xff09;联合墨天轮社区主办&#xff0c;围绕「数据库技术及应用」这一主题&#xff0c;六位数据库资深专家从数据库性能管理、数据…

Spring framework Day20:Spring AOP xml配置示例三

前言 本章节我们继续学习 AspectJ&#xff01; AspectJ是一个基于Java语言的面向切面编程(AOP)的扩展框架&#xff0c;它的诞生解决了很多传统面向对象编程的问题。在传统的面向对象编程中&#xff0c;开发者通常会将一些通用功能或者横切关注点&#xff08;cross-cutting co…

开发者基于 chroot 打造的工具macOS Containers

导读macOS Containers 是一群开发者基于 chroot 打造的工具&#xff0c;能让你在 macOS 用 Docker 运行 macOS 镜像。 macOS Containers 官网写道&#xff1a; 容器从根本上改变了现代软件的开发和部署方式。包括 FreeBSD、Solaris、Linux 甚至 Windows 在内的多种操作系统都支…

RabbitMQ的五种常见消费模型

目录 引言1. 简单队列模型&#xff08;Simple Queue Model&#xff09;优缺点及适用场景代码示例 2. 工作队列模型&#xff08;Work Queue Model&#xff09;优缺点及适用场景代码示例 3. 发布/订阅模型&#xff08;Publish/Subscribe Model&#xff09;优缺点及适用场景代码示…

论文解析-moETM-多组学整合模型

论文解析-moETM 参考亮点动机发展现状现存问题 功能方法Encoder改进Decoder改进 评价指标生物保守性批次效应移除 实验设置结果多组学数据整合cell-topic mixture可解释性组学翻译性能评估RNA转录本、表面蛋白、染色质可及域调控关系研究1. 验证同一主题下&#xff0c;top gene…

Android12之DRM基本接口实现(二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Android性能优化系列-腾讯matrix-流量监控之TrafficPlugin源码分析

前言 本篇进行matrix框架的网络流量监控模块的代码分析。你可能想&#xff0c;为什么需要对流量进行监控呢&#xff1f;我们平常进行的网络接口请求都是一些必要的操作&#xff0c;监控它的意义何在&#xff1f;首先我们要明确流量监控的对象是什么&#xff0c;是上行&#xf…