【鸿蒙 HarmonyOS 4.0】ArkTS开发语言

news2024/9/21 14:50:49

一、背景

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: string
  image: ResourceStr
  price: number
  discount: number

  constructor(name: string, image: ResourceStr, price: number,discount: number = 0) {
    this.name = name
    this.image = image
    this.price = price
    this.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.coloradmin.cn/o/1464679.html

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

相关文章

企业安全建设工具推荐

全自动化挖洞&#xff0c;助力企业安全建设&#xff0c;一键实现域名扫描、IP 发现、端口扫描、服务识别、网站识别、漏洞探测、分析发现、合规检查。 使用方式&#xff1a; 录入目标企业名称即可开始使用 技术细节&#xff1a; 第一步&#xff1a;通过企业主体关联企业备案…

前端学习——JS学习

文章目录 1. 定义变量&#xff0c;关键字 var、let、const2. 定义变量&#xff0c;数据类型3. 数组变量的操作4. 对象的操作5. JSON 字符串 1. 定义变量&#xff0c;关键字 var、let、const 这里主要是对var、let做比较 /** 1. var存在变量提升、let不存在变量提升 **/ cons…

办理布基纳法索(Burkina Faso)ECTN认证

布基纳法索ECTN认证 一. 什么是布基纳法索&#xff08;Burkina Faso&#xff09;ECTN认证? 根据布基纳法索&#xff08;Burkina Faso&#xff09;签发于 11/07/2006法令编号 00557的规定: 自2006年11月07 日起所有出口至布基纳法索&#xff08;Burkina Faso&#xff09;的货…

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(一)

在我们开始探索人工智能的世界时&#xff0c;了解如何与之有效沉浸交流是至关重要的。想象一下&#xff0c;你手中有一把钥匙&#xff0c;可以解锁与OpenAI的GPT模型沟通的无限可能。这把钥匙就是——正确的提示词&#xff08;prompts&#xff09;。无论你是AI领域的新手&#…

Vue响应式状态ref()与reactive()

1. ref()声明响应式状态 <template><!--在DOM元素调用变量时,不需要指定输出变量的value,因为Vue会帮你输出.value但是注意,这个帮助只会帮助顶级的ref属性才会被解包--><div>{{ count }}</div><div>{{ object }}</div><div>{{ arr…

vue Threejs实现任意画线(鼠标点击画线)

Threejs实现任意画线(鼠标点击画线) 鼠标左键单击添加点鼠标右键回退到上一个点,并继续画按住shift可以画平行于x轴或平行于z轴的线按Esc完成画线

如何把视频转换成mp4格式?总结4种转换方法【全】

随着视频在我们生活中的普及&#xff0c;我们常常需要将视频文件转换成不同的格式以适应不同的播放设备或应用场景。而MP4格式作为一种广泛兼容且高质量的视频格式&#xff0c;常常是人们的首选。因此&#xff0c;掌握将视频转换成MP4格式的方法变得至关重要。 在本文中&#…

消息队列MQ 保证消息不丢失(消息可靠性)

文章目录 概述RabbitMQ 怎么避免消息丢失&#xff08;可靠传输&#xff09;RocketMQ 怎么确保消息不丢失Kafka 怎么保证消息不丢失activeMQ 怎么避免消息丢失MQ 宕机了消息是否会丢失线上服务宕机时&#xff0c;如何保证数据100%不丢失吗&#xff1f;消息队列消息持久化 概述 …

如何做bug分析 ?bug分析什么 ? 为什么要做bug分析 ?

每当我们完成一个版本测试时&#xff0c;总会在测试报告中添加一些分析bug的指标 &#xff0c;主要用于分析在测试过程中存在的问题 。但是在分析的过程中你就可能遇到如下的问题 &#xff1a; 我应该分析那些指标呢 &#xff1f;每一个具体的指标该如何分析 &#xff1f;它能说…

软件性能测试和功能测试有何联系和区别?第三方软件检测机构简析

软件性能测试和功能测试是软件开发过程中非常重要的两个环节。从根本上说&#xff0c;它们都是为了保证软件质量和可靠性&#xff0c;但它们的目标和方法却有所不同。 软件性能测试是评估软件在特定负载下的性能表现&#xff0c;包括响应时间、吞吐量、并发能力等指标。它通过…

1.deeplabv3+网络结构及原理

这里的网络结构及原理可以看这篇博客&#xff0c;DeepLabV3: 在DeepLabV3基础上引入了Decoder_matlab deeplabv3resnet101-CSDN博客该博客翻译原论文解释得很清楚。 一、引言 语义分割的目标是为图像中的每个像素分配语义标签。在这项研究中&#xff0c;考虑了两种类型的神经网…

Flink ML 的新特性解析与应用

摘要&#xff1a;本文整理自阿里巴巴算法专家赵伟波&#xff0c;在 Flink Forward Asia 2023 AI特征工程专场的分享。本篇内容主要分为以下四部分&#xff1a; Flink ML 概况在线学习的设计与应用在线推理的设计与应用特征工程算法与应用 一、Flink ML 概况 Flink ML 是 Apache…

Python自动化UI测试之Selenium基础实操

1. Selenium简介 Selenium 是一个用于 Web 应用程序测试的工具。最初是为网站自动化测试而开发的&#xff0c;可以直接运行在浏览器上&#xff0c;支持的浏览器包括 IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Googl…

(done) 矩阵的对角化,以及是否可对角化的判断、还有对角化的本质。相似对角化计算过程

相似对角化 和 对角化 很大程度上是一回事 甚至判断两个矩阵的相似性&#xff0c;也跟对角化有很大关系 参考视频1&#xff1a;https://www.bilibili.com/video/BV1PA411T7b5/?spm_id_from333.788&vd_source7a1a0bc74158c6993c7355c5490fc600 参考视频2&#xff1a;http…

node 之 初步认识

思考&#xff1a;为什么JavaScript可以在浏览器中被执行 代执行的js代码——JavaScript解析引擎 不同的浏览器使用不同的JavaScript解析引擎 Chrome 浏览器 》 V8 Firefox浏览器 》OdinMonkey(奥丁猴&#xff09; Safri浏览器 》JSCore IE浏览器 》Chakra(查克拉&#xff09; e…

【算法分析与设计】

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位…

Vue 图片轮播第三方库 介绍

Vue图片轮播是一种在网页上以自动或手动方式展示图片的组件&#xff0c;常用于产品展示、网站banner等场景。有许多第三方库可以帮助Vue开发者轻松实现图片轮播功能。以下是一些流行的Vue图片轮播第三方库的介绍&#xff1a; 1. Vue-awesome-swiper - **简介**&#xff1a;V…

activeMq将mqtt发布订阅转成消息队列

1、activemq.xml置文件新增如下内容 2、mqttx测试发送&#xff1a; 主题&#xff08;配置的模糊匹配&#xff0c;为了并发&#xff09;&#xff1a;VirtualTopic/device/sendData/12312 3、mqtt接收的结果 4、程序处理 package comimport cn.hutool.core.date.DateUtil; imp…

【Vue】本地使用 axios 调用第三方接口并处理跨域

前端处理跨域 一. 开发准备 开发工具&#xff1a;VScode框架&#xff1a;Vue2项目结构&#xff1a;vue脚手架生成的标准项目&#xff08;以下仅显示主要部分&#xff09; 本地已搭建好的端口&#xff1a;8080要请求的第三方接口&#xff1a;http://1.11.1.111:端口号/xxx-api…

免费文档比对方案 基于Draftable的文档比对功能实现 避免key30天到期问题

一、需求说明 目前在通用文档系统中存在【文档比对】的功能&#xff0c;这里最好是支持word->word、pdf->pdf、word->pdf等形式的通用型比较。 二、首先说明下pdf pdf文件比较特殊&#xff0c;它实际上文字的坐标映射&#xff0c;没有常规文本的段落、句子等含义。所以…