【鸿蒙系统学习笔记】ArkTS开发语言

一、背景

ArkTSHarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。

二、基本语法

2.1、基本语法介绍

ArkTS的基本组成,资料来自官网:文档中心

说明:

①装饰器:用来装饰类结构、方法、变量

@Component表示自定义组件,@Entry表示该自定义组件为入口组件,@State表示组件中的状态变量,状态变量变化会触发UI刷新。

②自定义组件:可复用的UI单元

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

④系统组件:ArkUI提供的组件

容器组件---用来完成页面布局,例如Row、Column

基础组件---自带样式和功能的页面元素,例如Text

⑤事件方法:设置组件的事件回调

⑥属性方法:设置组件的UI样式

2.2、声明式UI

@Entry
@Component
struct Index {@State message: string = 'Hello World'build() {Row() {Column() {Text(this.message) // Text组件有参数.fontSize(50)  //给Text组件配置属性--字体大小.fontWeight(FontWeight.Bold)  //给Text组件配置属性--字体粗细//给Text组件配置点击事件.onClick(() => {this.message = 'Hello ArkTS'})Divider() // Divider组件无参数}.width('100%')}.height('100%')}
}

2.2.1、参数

①有参数

如果组件的接口定义包含构造参数,则在组件后面的“()”配置相应参数。例如Text组件👆

②无参数

如果组件的接口定义没有包含必选构造参数,则组件后面的“()”不需要配置任何内容。例如,Divider组件不包含构造参数👆

2.2.2、配置属性

属性方法以“.”链式调用的方式配置系统组件的样式和其他属性,建议每个属性方法单独写一行。

例如:Text组件配置的字体大小和字体粗细👆

2.2.3、配置事件

事件方法以“.”链式调用的方式配置系统组件支持的事件,建议每个事件方法单独写一行。

例如:给Text组件配置点击时间,当点击后,文字从'Hello World' 变成 'Hello ArkTS'👆

2.2.4、配置子组件

如果组件支持子组件配置,则需在尾随闭包"{...}"中为组件添加子组件的UI描述。Column、Row、Stack、Grid、List等组件都是容器组件。

以上代码是简单的Column组件配置子组件的示例👆

容器组件均支持子组件配置,可以实现相对复杂的多级嵌套。👇

@Entry
@Component
struct InfoPage {build() {Column() {Row() {Image($r('app.media.icon')).width(100).height(100)Button('确定').onClick(() => {console.log('1111')})}}}
}

三、 自定义组件

在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。

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

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

以下是自定义组件Header,默认导出 

@Component
export default struct Header {build() {Row(){Image($r('app.media.ic_public_back')).width(30)Blank()Image($r('app.media.ic_public_refresh')).width(30)}.width('100%')}
}

 例如:在首页中引入自定义组件Header使用

四、装饰器

示例代码:


import Header from '../common/Header'
class Item {name: stringimage: ResourceStrprice: numberdiscount: numberconstructor(name: string, image: ResourceStr, price: number,discount: number = 0) {this.name = namethis.image = imagethis.price = pricethis.discount = discount}
}
@Entry
@Component
struct ListPage {// 商品数据private items:Array<Item> = [new Item('MateBookProX', $r('app.media.mateBookProX'),6999,600),new Item('Mate X5', $r('app.media.mateX5'),13999)]// 局部公共样式函数@Styles fillScreen(){.width('100%').height('100%').backgroundColor('#EFEFEF').padding(20)}build() {Column({space:8}) {// 顶部Header().margin({bottom: 20})// 商品列表部分List({space: 8}){ForEach(this.items,(item:Item) => {ListItem(){Row({space: 10}){Image(item.image).width(100)Column({space: 4}){if(item.discount){Text(item.name).fontSize(20).fontWeight(FontWeight.Bold)Text('原价:¥' + item.price).fontColor('#CCC').fontSize(14).decoration({type: TextDecorationType.LineThrough})Text('折扣价:¥' + (item.price - item.discount)).fontColor('#F36').fontSize(18)Text('补贴:¥' + item.discount).fontColor('#F36').fontSize(18)}else{Text(item.name).fontSize(20).fontWeight(FontWeight.Bold)Text('¥' + item.price).fontColor('#F36').fontSize(18)}}.height('100%').alignItems(HorizontalAlign.Start)}.width('100%').backgroundColor('#FFF').borderRadius(20).height(120).padding(10)}})}.width('100%').layoutWeight(1)}.fillScreen()}
}

4.1、@Builder装饰器:自定义构建函数

@Builder所装饰的函数遵循build()函数语法规则,可以将重复使用的UI元素抽象成一个方法,在build方法里调用。

需求:目前的代码较长,为了提高可读性,便把商品卡片这一行封装成自定义构建函数

实现方式1:定义全局自定义构建函数ItemCard(),再到商品列表中进行引入,如下:

实现方式2:定义局部自定义构建函数ItemCard(),再到商品列表中进行引入,如下:

全局自定义构建函数与局部自定义构建函数的区别:

全局:是定义在组件外部的,需在方法名前面添加function关键字,如@Builder function ItemCard(){},调用时👉ItemCard()

局部:是定义在组件内部的,不需在方法名前面添加function关键字,如@Builder ItemCard(){},调用时需要加上this,👉this.ItemCard()

4.2、@Styles装饰器:定义组件重用样式 

@Styles装饰器可以将多条样式设置提炼成一个方法,直接在组件声明的位置调用。通过@Styles装饰器可以快速定义并复用自定义样式。用于快速定义并复用自定义样式。

需求:将Column的样式定义为自定义样式

实现方式1:定义全局公共样式函数fillScreen(),再引入到Column中使用

实现方式2:定义局部公共样式函数fillScreen(),再引入到Column中使用

全局公共样式函数与局部公共样式函数的区别:

全局:是定义在组件外部的,需在方法名前面添加function关键字,如@Styles function fillScreen(){},调用时👉 .fillScreen()

局部:是定义在组件内部的,不需在方法名前面添加function关键字,如@Styles fillScreen(){},调用时👉 .fillScreen()

4.3、@Extend装饰器:定义扩展组件样式

@Styles用于样式的扩展,@Extend用于扩展原生组件样式。

规则:和@Styles不同,@Extend仅支持定义在全局,不支持在组件内部定义。

需求:多个Text的样式一致,使用@Extend定义扩展组件样式

实现:

最后:👏👏😊😊😊👍👍

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

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

相关文章

AI专题:AI浪潮,海外日新月异,国内奋力追赶

今天分享的是AI系列深度研究报告&#xff1a;《AI专题&#xff1a;AI浪潮&#xff0c;海外日新月异&#xff0c;国内奋力追赶》。 &#xff08;报告出品方&#xff1a;方正证券&#xff09; 报告共计&#xff1a;24页 来源&#xff1a;人工智能学派 智算三方面奠基生产力革…

STM32学习笔记(七) —— DMA传输(MTM)

DMA&#xff0c;全称是Direct Memory Access&#xff08;直接内存访问&#xff09;。可以在存储器和存储器之间或者外设和存储器之间传输数据&#xff0c;而不需要CPU的干预&#xff0c;这样可以节省CPU的资源&#xff0c;提高工作效率。 1.功能框图 STM32F103RCT6有两个DMA控…

力扣773. 滑动谜题(BFS)

Problem: 773. 滑动谜题 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 由于题目提到最小步数&#xff0c;则可以使用BFS来穷举出最小的结果 1.转换为BFS问题&#xff1a;由于0代表空着的可以移动的位置&#xff0c;所以我们只需要从当前位置和0的相邻位置移动从而转…

代码随想录刷题笔记-Day20

1. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/ 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#x…

ARM体系在linux中的中断抢占

上一篇说到系统调用等异常通过向量el1_sync做处理&#xff0c;中断通过向量el1_irq做处理&#xff0c;然后gic的工作都是为中断处理服务&#xff0c;在rtos中&#xff0c;我们一般都会有中断嵌套和优先级反转的概念&#xff0c;但是在linux中&#xff0c;中断是否会被其他中断抢…

Cannot invoke “java.sql.Connection.prepareStatement(String)“ because “conn“

下载sqlite-jdbc&#xff0c;放在目录下&#xff0c;然后IDEA右键jar文件选择“加入库”即可解决 Central Repository: org/xerial/sqlite-jdbc/3.36.0.1

JavaScript 的location 对象API 介绍

JavaScript 中&#xff0c;location 对象提供了访问当前页面 URL 相关信息的属性和方法。通过 location 对象&#xff0c;我们可以获取当前页面的 URL、查询参数、锚点等信息&#xff0c;并且可以使用 JavaScript 来修改当前页面的 URL。 以下是一些 location 对象的常用属性和…

设计模式二:代理模式

1、什么是动态代理 可能很多小伙伴首次接触动态代理这个名词的时候&#xff0c;或者是在面试过程中被问到动态代理的时候&#xff0c;不能很好的描述出来&#xff0c;动态代理到底是个什么高大上的技术。不方&#xff0c;其实动态代理的使用非常广泛&#xff0c;例如我们平常使…

学习求余

题目描述 白浅妹妹今天学习了求余运算&#xff0c;她很好奇求余运算和乘法运算结合起来会是什么样子&#xff0c;于是她设计了这样一道题目。 给定数字 n&#xff0c;你可以任选一个数字 k(1 ≤ k ≤ n)&#xff0c;然后计算出 n%k 的值(其中% 为求余运算)&#xff0c;记为 q…

php伪协议之phar

一.phar协议 用于将多个 PHP 文件、类、库、资源&#xff08;如图像、样式表&#xff09;等打包成一个单独的文件。这个归档文件可以像其他 PHP 文件一样被包含&#xff08;include&#xff09;或执行。PHAR 归档提供了一种方便的方式来分发和安装 PHP 应用程序和库&#xff0c…

【RT-DETR有效改进】可变形大核注意力 | Deformable-LKA适用于复杂背景或不同光照场景

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进内容是Deformable-LKA(可变形大核注意力)。Deformable-LKA结合了大卷积核的广阔感受野和可变形卷积的灵活性,有效地处理复杂的视觉信息。这一机制通过动态调整卷积核的形状和大小来适…

Sui主网升级至V1.18.1版本

Sui主网现已升级至V1.18.1版本&#xff0c;同时Sui协议升级至36版本。其他升级要点如下所示&#xff1a; #15794 解析错误不再停止编译&#xff0c;并且后续编译阶段的诊断信息也可能包含在编译结果中&#xff0c;所以开发者可能会看到比以前更多的编译器诊断信息。 #12337 …