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

鸿蒙学习笔记

目录

工程目录

默认代码

整体结构

状态变量

build 方法

RelativeContainer 容器

Text 组件

ArkTS中常见的数据类型

数组

对象

函数

箭头函数

组件基础语法

通用属性

文本属性

图像组件

内外边距

border属性

布局细节

细节1

细节2-内容的居中与左对齐

List组件

layoutWeight详解

常见问题解答

 if分支语句

条件表达式

条件渲染

循环渲染

状态管理

@Builder

Stack容器组件

核心特性

基础语法

关键属性

常见问题


工程目录


默认代码

index.ets的默认代码如下:

整体结构

@Entry
@Component
struct Index {// ...
}
  • @Entry: 装饰器,表示这个组件是应用的入口组件(首页)

  • @Component: 装饰器,表示这个结构体是一个自定义组件

  • struct Index: 定义了一个名为 Index 的结构体组件

状态变量

@State message: string = 'Hello World';
  • @State: 状态装饰器,表示这个变量是组件的状态数据

  • message: 状态变量名,类型为 string,初始值为 'Hello World'

  • 当 message 值变化时,会触发组件的重新渲染

build 方法

build() {// UI 描述
}
  • 每个组件必须实现 build 方法

  • 用于描述 UI 的结构和布局

RelativeContainer 容器

RelativeContainer() {// 子组件
}
.height('100%')
.width('100%')
  • RelativeContainer: 相对布局容器,子组件可以通过相对定位规则进行布局

  • .height('100%'): 设置容器高度为父容器的 100%

  • .width('100%'): 设置容器宽度为父容器的 100%

Text 组件

Text(this.message).id('HelloWorld').fontSize($r('app.float.page_text_font_size')).fontWeight(FontWeight.Bold).alignRules({center: { anchor: '__container__', align: VerticalAlign.Center },middle: { anchor: '__container__', align: HorizontalAlign.Center }}).onClick(() => {this.message = 'Welcome';})
  • Text(this.message): 文本组件,显示 message 状态变量的值

  • .id('HelloWorld'): 为组件设置 ID,可用于相对布局中的锚点引用

  • .fontSize($r('app.float.page_text_font_size')): 设置字体大小,从资源文件中获取值

  • .fontWeight(FontWeight.Bold): 设置字体加粗

  • .alignRules(): 设置相对布局规则

    • center: 垂直居中(相对于容器)

    • middle: 水平居中(相对于容器)

    • __container__: 表示相对于父容器

  • .onClick(): 点击事件处理,点击后会将 message 的值改为 'Welcome' 

关于$r('app.float.page_text_font_size')

  • $r():资源引用函数,全称是"resource reference"

  • 'app.float.page_text_font_size':资源路径标识符

    • app:表示应用级资源(固定前缀)

    • float:资源类型,表示这是一个浮点数类型的资源

    • page_text_font_size:资源名称(自定义的)

在我当前的项目中,它所指的路径是:

resources/└── base/└── element/└── float.json

注意:实际路径可能因HarmonyOS版本略有不同,但基本结构一致

ArkTS中常见的数据类型

注意:ArkTS 的设计目标是简化前端开发,因此不强制区分整数和浮点数,ArkTS 没有 int/long,因为number 足够灵活

数组

对象

先定义好接口,再用接口约定对象的数据类型(定义对象是的数据类型名就是接口名)。接口名推荐首字母大写。用接口约定对象指的是:对象里面的变量名和对应的类型,要跟接口里定义的一致。

小细节1

接口里定义的属性签名之间不需要用逗号隔开,但是对象里定义的属性之间必须要用逗号隔开

小细节2

在ArkTS中,直接打印对象是看不到对象的具体信息的,只会输出Object,要想看到具体内容,需要打印 对象.属性名 才行

函数

箭头函数

组件基础语法

注意1:build()里要有唯一的容器根组件,由于手机都是自下而上布局的,所以容器根组件一般都是Column

注意2:内容组件如果要设置内容水平居中,可以使用.textAlign(TextAlign.Center),例如

Text('内容')
.textAlign(TextAlign.Center)

通用属性

vp会自动适配不同尺寸的屏幕

在鸿蒙中,满屏尺寸是360或'100%',例如width(360)或width('100%')

文本属性

fp和vp是一样大的,但fp有一个优点:如果用户把手机系统的字体改大或改小,fp可以自适应变化。

图像组件

设置图片宽高有一个特点:只需要设置一个宽或高就行,因为系统会根据图片的原始比例进行等比缩放。

内外边距

如果希望内容跟组件边缘有距离,用内边距padding

如果希望组件之间有距离,用外边距margin

border属性

示例

布局细节

细节1

当给根组件设置宽高百分之百时,系统会预留安全区,如图:

道理也很简单,上面的区域要用于展示手机电池电量,wifi使用等信息;下面的区域要用于展示手机的导航条(用过只能手机的都知道,有三个小按钮)

如果确实想要全部覆盖,可以用下面的属性:

内容较长,这里提供复制粘贴:

.expandSafeArea([SafeAreaType.SYSTEM],[SafeAreaEdge.TOP,SafeAreaEdge.BOTTOM])

细节2-内容的居中与左对齐

当我们第一次写的时候,会疑惑,为什么内容默认是从左边开始的,例如:

接下来,我将一步步刨析。。。。

首先,我们先给根组件加个背景颜色,方便观察:

这时候,我们就发现了,原来并不是内容默认在左边,而是根组件Column只有这么点大(可以看成被内容撑开的大小),而根组件就是默认位于左上角。

那我们现在将跟组件的大小扩展成全屏:

可以发现,文字内容水平居中了,由此我们可以得出结论,组件里的内容,默认是基于组件的大小进行水平居中的。

那如果我们想在根组件全屏的情况下,让里面的内容左对齐,该怎么办呢?只需要给内容组件加一个.width('100%')即可:

为什么加width('100%')就可以左对齐了呢?我是这么理解的:

在加width('100%')之前,内容组件的宽度跟文字宽度一样,并且以根组件的宽度为基准进行水平居中,所以文字在中间:

(两条红线画得不是很标准,能理解意思就行)

在加width('100%')之后,内容组件的宽度大于文字宽度,文字内容会从左到右书写,而内容组件还是以根组件的宽度为基准进行水平居中,此时,看上去,文字内容就左对齐了:

(两条红线画得不是很标准,能理解意思就行)

List组件

ArkTS中的List组件是一个高性能的滚动列表容器,用于展示一系列垂直或水平排列的列表项。它是HarmonyOS应用开发中常用的UI组件之一。

如果想要让滚动条不显示,可以给List组件加上.scrollBar(BarState.Off)

现在预览滚动时,就不会显示滚动条了。

layoutWeight详解

layoutWeight 是 ArkTS 中用于分配剩余空间的重要布局属性,类似于 Android 中的 layout_weight 或 CSS 中的 flex-grow。它允许组件按比例分配父容器中的剩余空间。

当父容器有剩余空间时,layoutWeight 决定了子组件如何分配这些额外空间:

  1. 工作原理:系统会先计算所有子组件的固定尺寸,然后按照各自的 layoutWeight 值比例分配剩余空间

  2. 默认值:如果不设置,默认值为 0,表示不参与剩余空间分配

  3. 适用场景:常用于需要按比例分配空间的布局,如等分屏幕、固定比例布局等

常见问题解答

Q: layoutWeight和width/height同时设置会怎样?
A: 系统会优先满足固定尺寸,然后剩余空间按weight分配。如果空间不足,固定尺寸优先。

Q: 为什么我的layoutWeight没效果?
A: 检查父容器是否有足够剩余空间,以及是否正确设置了尺寸(如.width('100%'))

Q: 负值weight有效吗?
A: 无效,weight必须是≥0的数字

在 ArkTS 中,如果不设置 layoutWeight(默认值为 0),表示该组件不会参与父容器的剩余空间分配,此时组件的大小行为如下:

1.只占用自身声明的固定尺寸
如果设置了固定宽/高(如 .width(100)),则严格按该尺寸显示

Text('固定宽度').width(100)  // 最终宽度就是100px,不参与剩余空间分配

2.未设置固定尺寸时

  • 在 Row 中:宽度由内容撑开(文本长度、图片尺寸等)

  • 在 Column 中:高度由内容撑开

 if分支语句

条件表达式

条件渲染

循环渲染

状态管理

@Builder

ArkTS 中的 @Builder 详解

@Builder是 ArkTS 中用于构建可复用 UI 组件的装饰器,它允许你将 UI 片段封装成可复用的构建函数。下面我将从多个角度详细解释它的用法和特性。

基本概念

@Builder本质上是一个 UI 构建函数,它可以:
- 封装 UI 片段
- 接受参数进行定制
- 在组件内或全局复用

基本语法

1. 组件内 @Builder

@Component
struct MyComponent {@Builder myBuilderFunc() {Column() {Text('Hello').fontSize(20)Button('Click me')}}build() {Column() {this.myBuilderFunc() // 调用Builder}}
}

2. 全局 @Builder

@Builder function GlobalBuilder() {Row() {Image($r('app.media.icon'))Text('Global Builder')}
}@Entry
@Component
struct MyComponent {build() {Column() {GlobalBuilder() // 调用全局Builder}}
}

小细节

1. 全局 Builder(需要 function 关键字)

当你想定义一个 全局可复用 的 Builder 时,必须使用 function 关键字

特点

  • 定义在组件外部

  • 可以被项目中任何组件使用

  • 必须加 function 关键字

  • 通常放在文件顶层或单独的工具类中

  • 直接通过builderName()调用

2. 组件内 Builder(不需要 function

当 Builder 是 组件内部专用 时,直接作为组件的成员方法

  • 定义在组件内部

  • 只能被当前组件使用

  • 不需要 function 关键字

  • 通过 this.builderName() 调用


核心特性

1. 参数传递

@Builder可以接受参数:

@Builder function ParamBuilder(label: string, color: Color) {Text(label).fontColor(color).fontSize(20)
}@Entry
@Component
struct MyComponent {build() {Column() {ParamBuilder('Warning', Color.Red)ParamBuilder('Info', Color.Blue)}}
}

2. 嵌套调用Builder

可以调用其他 Builder:

@Builder function InnerBuilder() {Text('Inner Content')
}@Builder function OuterBuilder() {Column() {InnerBuilder()Divider()Text('Outer Content')}
}

3. 与组件方法结合

Builder 中可以调用组件的方法:

@Component
struct MyComponent {count: number = 0addCount() {this.count++}@Builder myBuilder() {Button(`Clicked ${this.count} times`).onClick(() => this.addCount())}build() {Column() {this.myBuilder()}}
}

高级用法

1. @BuilderParam

用于组件间传递 Builder:

@Component
struct ChildComponent {@BuilderParam contentBuilder: () => voidbuild() {Column() {this.contentBuilder()}}
}@Entry
@Component
struct ParentComponent {@Builder customBuilder() {Text('Custom Content')}build() {Column() {ChildComponent({ contentBuilder: this.customBuilder })}}
}

2. 条件渲染

Builder 中可以包含逻辑:

@Builder function ConditionalBuilder(show: boolean) {if (show) {Text('Visible')} else {Text('Hidden').opacity(0.5)}
}

Stack容器组件

Stack 是 ArkTS 中一种常用的布局容器组件,它允许子组件按照堆叠顺序(z-index)进行层叠排列,类似于 CSS 中的绝对定位布局。

核心特性

  1. 层叠布局

    • 所有子组件默认从同一基准点(左上角)开始布局

    • 后添加的子组件会覆盖在先添加的子组件上方(除非显式设置 z-index)

  2. 默认行为

    • 子组件未设置位置时,默认堆叠在容器左上角

    • 子组件会按照代码书写顺序从底向上层叠(最后一个在最上层)

  3. 尺寸特性

    • 默认撑满父容器(若不设置宽高)

    • 子组件可以通过定位属性自由控制位置

基础语法

Stack({ alignContent: Alignment.BottomEnd }) {// 子组件会从这里开始层叠Image($r('app.media.bg')).width('100%').height('100%')Text('水印文字').fontSize(16).margin(10)
}
.width('100%')
.height(200)
.border({ width: 1, color: Color.Gray })

关键属性

子组件可以用下面的属性来控制位置:

常见问题

Q: 如何让某个子组件始终保持在最底层?
A: 为该组件设置 .zIndex(0),并为其他组件设置更高的 zIndex

Q: Stack 的子组件能超出容器范围吗?
A: 默认会裁剪超出部分,可通过 .clip(false) 关闭裁剪

Q: 性能考虑
A: 避免在 Stack 中嵌套过多层级,特别是带有动画效果的子组件

Stack 组件非常适合需要创建重叠、悬浮、层叠效果的界面设计,合理使用可以大大增强 UI 的表现力。

http://www.dtcms.com/a/267145.html

相关文章:

  • 【单片机毕业设计17-基于stm32c8t6的智能倒车监测系统】
  • android studio 配置硬件加速 haxm
  • Java 大视界 -- Java 大数据在智能安防周界防范系统中的智能感知与自适应防御(333)
  • elementui表格增加搜索功能
  • ✨ OpenAudio S1:影视级文本转语音与语音克隆Mac整合包
  • 2025使用VM虚拟机安装配置Macos苹果系统下Flutter开发环境保姆级教程--中篇
  • Ubuntu:Mysql服务器
  • 用户中心Vue3网页开发(1.0版)
  • 类图+案例+代码详解:软件设计模式----适配器模式
  • HarmonyOS学习3---ArkUI
  • Java零基础笔记01(JKD及开发工具IDEA安装配置)
  • 【Linux网络篇】:网络中的其他重要协议或技术——DNS,ICMP协议,NAT技术等
  • STM32第十四天串口
  • uniapp启动图被拉伸问题
  • 国产 OFD 标准公文软件数科 OFD 阅读器:OFD/PDF 双格式支持,公务办公必备
  • React Hooks 内部实现原理与函数组件更新机制
  • 【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
  • stm32的三种开发方式
  • Zigbee/Thread
  • 车载以太网-防火墙
  • 【深度学习】强化学习(Reinforcement Learning, RL)主流架构解析
  • 2025使用VM虚拟机安装配置Macos苹果系统下Flutter开发环境保姆级教程--下篇
  • React Native 开发环境搭建--mac--android--奔溃的一天
  • App爬虫实战篇-以华为真机手机爬取集换社的app为例
  • Pytest 测试发现机制详解:自动识别测试函数与模块
  • 在 Ubuntu 下配置 oh-my-posh —— 普通用户 + root 各自使用独立主题(共享可执行)
  • Redis Cluster 与 Sentinel 笔记
  • 文本方式和二进制方式打开文件的不同
  • Flutter 使用http库获取网络数据的方法(一)
  • Excel 数据透视表不够用时,如何处理来自多个数据源的数据?