鸿蒙应用开发从入门到入行 - 篇4:层叠布局、自定义组件、ForEach
第四篇 - 层叠布局、自定义组件、ForEach循环生成组件
导读:在本篇文章里,您将掌握层叠布局、自定义组件的用法,特别是自定义组件将来的开发中必然会用,其中应该特别关注自定义组件的一些规范与装饰器。
Stack - 层叠容器组件
在App效果中,我们经常看到一些
阴影蒙版、加载中遮罩等,如下图列表所示:像这种:把某个组件堆叠到另外一个组件上的效果,称之为
层叠效果或者堆叠效果(就像小时候玩的叠罗汉,一个人叠在另一个人上面)- 温馨提示:成都网友请勿看上图
使用语法
Stack() {
item1()
item2()
item3()
}默认情况下:越在后面的组件越叠在最高层(就像叠罗汉,后来的在最上),所以上述代码后的层级效果如下图
默认情况下:子组件都在
Stack容器内居中堆叠,如果需要修改,需要通过alignContent参数实现位置的相对移动,一共有9种方式如下图修改方法
Stack({ alignContent: Alignment.TopStart }) { // 改成在左上对齐堆叠
.....
}如果需要手动指定谁在最上层,可以使用
zIndex属性,修改层级。zIndex的值越大越叠在最上面Stack({ alignContent: Alignment.BottomStart }) {
Column() {
Text('Stack子元素1').fontSize(20)
}.width(100).height(100).backgroundColor(0xffd306).zIndex(2) Column() {
Text('Stack子元素2').fontSize(20)
}.width(150).height(150).backgroundColor(Color.Pink).zIndex(1) Column() {
Text('Stack子元素3').fontSize(20)
}.width(200).height(200).backgroundColor(Color.Grey) }.width(350).height(350).backgroundColor(0xe0e0e0)此时,虽然子元素1是一开始写的,但是它的zIndex最大,所以会在最上层。子元素2的zIndex值小一点,所以在中间。子元素3因为没有写zIndex,层级最低,所以在最里层。效果如下图
自定义组件
为什么需要
很多时候我们需要自定义一些由其他组件布局组合在一起的组件,方便在界面上复用,例如上期布置的附加作业年度待办目标
待办列表区里的每一项组成元素比较多,比如有Row、Checkbox、Text等。而且这些元素组合起来的部分,多次需要使用。那么为了更好的维护、修改、复用,可以把这一部分封装成自定义组件
组件怎么创建
一般情况下,为了更好的管理项目中的文件,我们会把自定义组件放到一个跟
pages目录同级的新的文件夹里,起名叫components或者view。文件夹起名每个人都有自己的喜好,这里我不强求。但是本文后面以view起名作为存放组件的文件夹- 华为鸿蒙官网的Codelabs上大部分示例代码都是以
view作为文件夹,所以这里猫林老师也保持同步
- 华为鸿蒙官网的Codelabs上大部分示例代码都是以
组件将来我们都以.ets文件结尾,接下来,我们在view文件夹里创建一个组件文件:对着view文件夹鼠标右键->新建->ArkTS File->然后输入组件名即可
注意:组件名应该使用多单词大驼峰形式,建好后如下图
那么如何快速生成一个组件结构呢?
输入comp出提示后按回车即可此时本文件会生成如下代码
@Component
struct {
build() { }
}注意看会发现,代码中还没有组件名字,因此我们还需要手动填入名字。名字跟文件名应该保持一致,因此改完后如下
@Component
struct ToDoItem {
build() { }
}这样就建好一个空组件了
装饰器 - @Component与@Entry
大家通过代码可以发现,无论是新建项目默认生成的
Index.ets文件,或者是我们刚刚创建的ToDoItem自定义组件,都有struct关键字。这里先对它做个说明
struct代表结构体,也是一种数据类型(有兴趣详细了解可以去学习TS语法)
但对于我们目前的鸿蒙应用开发中,暂时只要知道。不管是页面还是自定义组件(页面也可以理解为就是个很大的组件),都用
struct修饰,即都为以下格式struct 组件名{
build() { }
}每个组件(页面也是组件),内都必须有个
build函数,在这个函数里写描述界面的代码- 提示:别忘了,每个build里有且只有一个根容器哦
学过TS或者Java或者C的都知道,struct只是一个结构体,怎么就跟组件扯上关系了呢?
这就跟它上面的
@Component有关
@Component说明
这是一个装饰器
通过上一篇的学习我们了解到装饰器可以让某个数据具备特殊功能,例如@State可以让数据驱动UI更新
所以**
@Component这个装饰器就是能让struct这个数据具备组件的功能**因此你会发现默认生成的
Index.ets和我们自定义的组件TOdoItem都有这个装饰器
@Entry又是什么呢?
- 入口的意思
- 作用:把某个组件作为这个页面的第一个入口组件启动
- 一个页面有很多自定义组件,那么启动这个页面到底以哪个组件作为入口组件呢?就是通过
@Entry来指定的 - 并且,加了@Entry的组件,也能被预览器预览
预览自定义组件
自定义组件创建完,我们需要一边写代码一边看效果。可是默认情况下自定义组件无法在预览器里进行预览,这时候需要加一个装饰器
@Preview@Preview
@Component
struct ToDoItem {
build() { }
}这样我们就能进行界面编写,并且在预览器看到预览效果了
构建TodoItem自定义组件的界面
根据效果图分析发现这个组件根容器应该是一个
Row,里面两个子组件:Checkbox与Text且Row需要设置圆角、背景色、最好给个高度,Checkbox需要给左右外间距
代码如下
build() {
Row() {
Checkbox()
.margin({ left: 20, right: 20 })
Text('中彩票500万')
}
.width('100%')
.height(40)
.backgroundColor(Color.White)
.borderRadius(20)
}
如何使用自定义组件
需要先导出、再导入,即可使用
导出:
- 只要在
struct前加一个export即可
export struct ToDoItem {
....
}- 只要在
导入:
- import语法
import { 组件名 } from '路径'
// 例
import { ToDoItem } from '../view/ToDoItem'使用:
ToDoItem()DevEco非常强大,我们也可以不写导入的代码,让DevEco自动生成
做法:给组件加完
export后,来到需要用到组件的地方,直接写组件名,出提示后按回车
至此,我们完成了TodoItem组件的简单编写。并通过它学习了装饰器、组件创建和使用的相关知识。等接下来完成“年度待办”案例时,还会回来丰富它,但目前就到此为止吧
ForEach循环生成组件
若需要根据数组数据生成一堆同类型的组件,则需要用到
ForEach作用:根据数组生成组件,数组有多少个元素,就生成多少个组件
语法:
ForEach (数组, (item: 类型, index: number) => {
// 组件
})例:
@State arr: string[] = ['a', 'b', 'c', 'd'] ForEach (this.arr, (item: string, index: number) => {
// 组件
Row () {
Text(`item的值是:${item},index是:${index}`)
}
})结果如下
注:ForEach有第三个参数,是键值生成函数。作用:为数据源arr的每个数组项生成唯一且持久的键值。有点类似vue里的
v-bind:key,这里我就不细讲了,等哪一天专门出一篇技术文讲解。本系列文章主要是侧重于教会开发技能,理论细节及各种原理和性能优化等内容,未来会偶尔写文说明,所以敬请关注本号,免得错过最新内容。
- 提示:ArkTS是一种强类型语言,所以每种数据必须声明类型,比如
(item: string, index: number),不能省略类型 - 试一试,大家可以用ForEach生成我们刚刚封装的
TodoItem看看
总结内容
- 本篇文章我们主要学习了三个方面:Stack、自定义组件、ForEach
- Stack:
- 层叠组件,只要是实现一个组件叠在另外一个组件上面的都可以用Stack包起来
- 默认越后面写的组件层级越高
- 可以通过
zIndex属性方法修改,数字越大层级越高
- 自定义组件
- 当某个界面区域可能要多次复用时,封装成自定义组件方便复用
- 其次,自定义组件也能更好的管理代码文件、让界面更清爽、利于维护
- @Component 修饰的结构体才算组件
- @Entry是入口的意思,代表某个页面启动的第一个组件
- @Preview可以预览自定义组件
- 导出组件:export
- 导入组件:import
- ForEach
- 根据数组生成组件
课后练习
判断题
- 自定义组件可以直接预览
问答题
请说出下列代码的层级
Stack() {
组件A().zIndex(2)
组件B().zIndex(0)
组件C()
}
今天又补全了一些知识,大家可以把上一篇文章的
年度待办计划作业的布局给完成了,下一期会讲组件传值的相关知识附:
年度待办计划初始数据@State totalTasks: Array<TodoModal> = [
{ text: "月入5万", finished: false },
{ text: "中彩票500万", finished: false },
{ text: "找个富婆", finished: false },
{ text: "买套别墅", finished: false },
{ text: "改掉爱做梦的习惯", finished: false },
];class TodoModal {
text: string = ''
finished: boolean = false
}
互动环节
- 看到那个赞了吗?给我狠狠点下去!
交流群
- 建了个鸿蒙交流群,帮助希望从业的人员方便交流技术以及获取鸿蒙认证。需要的请添加猫林老师微信(llybf365),拉你进群
鸿蒙应用开发从入门到入行 - 篇4:层叠布局、自定义组件、ForEach的更多相关文章
- Python Web自动化测试入门与实战,从入门到入行
Python Web自动化测试入门与实战 购买地址 · 京东:https://item.jd.com/69239480564.html 天猫:https://detail.tmall.com/it ...
- LARK BOARD开发板入门学习-第2篇
1. 本次主要研究下HDMI接口,使用芯片是CH7033,这个芯片可以接VGA和HDMI两种接口,和FPGA的接口是地址数据总线 2. 值得注意的地方,下图的D1,双二极管BAT54S在电路中一般用于 ...
- 【golang-GUI开发】struct tags系统(二)qt的自定义组件和构造函数
今天我们来讲讲自定义组件和它的构造函数. 在前面的文章里我们已经接触了好几个自定组件,这次的示例是一个自定义对话框,他有一个about按钮,点击按钮可以显示出Qt的信息或者用户输入的信息.这是效果图: ...
- 「Android 开发」入门笔记
「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...
- 《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
<ASP.NET Core跨平台开发从入门到实战>样章节 Web API自定义格式化protobuf. 样章 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于 ...
- android开发之自定义组件
android开发之自定义组件 一:自定义组件: 我认为,自定义组件就是android给我们提供的的一个空白的可以编辑的图片,它帮助我们实现的我们想要的界面,也就是通过自定义组件我们可以把我们要登入的 ...
- 浅谈入行Qt桌面端开发程序员-从毕业到上岗(1):当我们说到桌面端开发时,我们在谈论什么?
谈谈我自己 大家好,我是轩先生,是一个刚入行的Qt桌面端开发程序员.我的本科是双非一本的数学专业,22年毕业,只是部分课程与计算机之间有所交叉,其实在我毕业的时候并没有想过会成为一名程序员,也没有想过 ...
- PHP开发入行真功夫 三扬科技
前言与目录 PHP开发入行真功夫 前言 PHP开发入行真功夫 目录 第2章 基本语法 2.1.1 判断闰年程序 2.1.2 我们现在能做的…… 2.2.1 PHP的语言概貌 2.2.2 为我们的程 ...
- 《开发专家 Visual C 开发入行真功夫》笔记
智能感知的功能,输入 is 后,同时按下Alt + →这两个键就出现了供选择变量.方法.宏等的列表,继续输入 in 后,isInit就出来了. stdafx.h预编译头文件,.h应用程序主头文件,do ...
- 最全华为鸿蒙 HarmonyOS 开发资料汇总
开发 本示例基于 OpenHarmony 下的 JavaScript UI 框架,进行项目目录解读,JS FA.常用和自定义组件.用户交互.JS 动画的实现,通过本示例可以基本了解和学习到 JavaS ...
随机推荐
- USB总线-Linux内核USB设备驱动之UAC2驱动分析(十)
1.概述 UVC(USB Audio Class)定义了使用USB协议播放或采集音频数据的设备应当遵循的规范.目前,UAC协议有UAC1.0和UAC2.0. UAC2.0协议相比UAC1.0协议,提供 ...
- YashanDB个人版正式开放下载!参与首批体验官活动赢好礼!
好消息!国产数据库YashanDB个人版已正式向所有用户和开发者全面开放下载,该版本已在官网同步上线,欢迎大家前往官网下载体验! 与此同时,YashanDB联合墨天轮技术社区启动首批「产品体验官」尝鲜 ...
- 1. C#面试题 - Webservice和WebApi的区别
1. Webservice : 基于SOAP协议的,数据格式时XML,只支持http协议,不是开源的,只能部署在IIS上 2. Webapi 开源的,.net 平台
- dockerfile构建docker镜像
1.dockerfile构建nginx镜像,准备nginx.repo文件 [root@localhost dockerfile]# cat nginx.repo [nginx] name = ngin ...
- select语句
SELECT语句可以从表中选择数据 SELECT <列名1>,<列名2> as "aaa" FROM <表名>; 查询两列数据SELECT * ...
- .NET云原生应用实践(二):Sticker微服务RESTful API的实现
本章目标 完成数据访问层的基本设计 实现Sticker微服务的RESTful API 引言:应该使用ORM框架吗? 毋庸置疑,Sticker微服务需要访问数据库来管理"贴纸"(也就 ...
- 图菱科技 SaaS 系统容器化最佳实践
大家好,我是龚承明,在图菱(成都)科技有限公司任职,主要负责公司的产品系统研发以及公司IT基础设施的建设工作.本篇文章将为大家介绍下我司在采用 KubeSphere 平台实现公司业务系统容器化过程中的 ...
- 云原生爱好者周刊:client-go 示例大全
开源项目推荐 Kubernetes client-go examples 本仓库提供了非常详尽的 client-go 使用案例,非常适合 client-go 初学者. TripleCross Trip ...
- OpenCv Mat 数据结构
前言 OpenCv的Mat数据结构可以存储图片信息.但是以坐标系构建来说,Mat是以左上角为原点,而我们自己的日常习惯是以左下角为原点. 本文提供了这两者之间的一种转换. 假设 Mat : (x,y) ...
- OpenCV开发笔记(八十一):通过棋盘格使用鱼眼方式标定相机内参矩阵矫正摄像头图像
前言 对于广角摄像头通过相机图片可以识别出棋盘角点计算相机内参矩阵,通过畸变校准可以得到较好的效果,但是鱼眼摄像头通过这种方式获得周围四周的图像效果并不是很好.所以,鱼眼摄像头在校准上与普通摄像头 ...