首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >鸿蒙应用开发从入门到入行 - 篇4:层叠布局、自定义组件、ForEach

鸿蒙应用开发从入门到入行 - 篇4:层叠布局、自定义组件、ForEach

原创
作者头像
猫林老师
发布于 2024-12-23 03:55:26
发布于 2024-12-23 03:55:26
2760
举报

鸿蒙应用开发从入门到入行

第四天 - 层叠布局、自定义组件、ForEach循环生成组件

导读:在本篇文章里,您将掌握层叠布局、自定义组件的用法,特别是自定义组件将来的开发中必然会用,其中应该特别关注自定义组件的一些规范与装饰器。

Stack - 层叠容器组件

  • 在App效果中,我们经常看到一些阴影蒙版、加载中遮罩等,如下图列表所示:
fig:
fig:
fig:
fig:
  • 像这种:把某个组件堆叠到另外一个组件上的效果,称之为层叠效果或者堆叠效果(就像小时候玩的叠罗汉,一个人叠在另一个人上面)
fig:
fig:
  • 温馨提示:成都网友请勿看上图
  • 使用语法
  • Stack() { item1() item2() item3() }
  • 默认情况下:越在后面的组件越叠在最高层(就像叠罗汉,后来的在最上),所以上述代码后的层级效果如下图
fig:
fig:
  • 默认情况下:子组件都在Stack容器内居中堆叠,如果需要修改,需要通过alignContent参数实现位置的相对移动,一共有9种方式如下图
fig:
fig:
  • 修改方法
  • 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,层级最低,所以在最里层。效果如下图
    fig:
    fig:

自定义组件

为什么需要
  • 很多时候我们需要自定义一些由其他组件布局组合在一起的组件,方便在界面上复用,例如上期布置的附加作业年度待办目标
fig:
fig:
  • 待办列表区里的每一项组成元素比较多,比如有Row、Checkbox、Text等。而且这些元素组合起来的部分,多次需要使用。那么为了更好的维护、修改、复用,可以把这一部分封装成自定义组件
组件怎么创建
  • 一般情况下,为了更好的管理项目中的文件,我们会把自定义组件放到一个跟pages目录同级的新的文件夹里,起名叫components或者view。文件夹起名每个人都有自己的喜好,这里我不强求。但是本文后面以view起名作为存放组件的文件夹
    • 华为鸿蒙官网的Codelabs上大部分示例代码都是以view作为文件夹,所以这里猫林老师也保持同步
fig:
fig:
  • 组件将来我们都以.ets文件结尾,接下来,我们在view文件夹里创建一个组件文件:对着view文件夹鼠标右键->新建->ArkTS File->然后输入组件名即可
fig:
fig:
fig:
fig:
  • 注意:组件名应该使用多单词大驼峰形式,建好后如下图
fig:
fig:
  • 那么如何快速生成一个组件结构呢?输入comp出提示后按回车即可
fig:
fig:
  • 此时本文件会生成如下代码
  • @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都有这个装饰器
    fig:
    fig:
  • @Entry又是什么呢?
    • 入口的意思
    • 作用:把某个组件作为这个页面的第一个入口组件启动
    • 一个页面有很多自定义组件,那么启动这个页面到底以哪个组件作为入口组件呢?就是通过@Entry来指定的
    • 并且,加了@Entry的组件,也能被预览器预览
预览自定义组件
  • 自定义组件创建完,我们需要一边写代码一边看效果。可是默认情况下自定义组件无法在预览器里进行预览,这时候需要加一个装饰器@Preview
  • @Preview @Component struct ToDoItem { build() { } }
  • 这样我们就能进行界面编写,并且在预览器看到预览效果了
构建TodoItem自定义组件的界面
fig:
fig:
  • 根据效果图分析发现这个组件根容器应该是一个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后,来到需要用到组件的地方,直接写组件名,出提示后按回车
    fig:
    fig:
    fig:
    fig:
  • 至此,我们完成了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}`) } })
  • 结果如下
fig:
fig:

注: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 }

互动环节

  • 看到那个赞了吗?给我狠狠点下去!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux服务器使用Crontab控制定时任务
Crontab,可以将任何脚本、程序或文档安排在某个最方便的时间运行。通俗的讲就是定时执行某个脚本、程序。 常见用途: 定时关机 定时检查更新 定时对系统配置、数据库、日志进行备份 定时清理垃圾文件 检测是否已安装 crontab -bash: crontab: command not found 执行 crontab 命令如果报 command not found,就表明没有安装. 开始安装 #yum -y install vixie-cron crontabs -y crontab
刺_猬
2018/06/21
2.3K0
Linux 命令之 crontab 定时计划
crontab命令用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行
胡齐
2020/01/15
1.1K0
Linux中Crontab(定时任务)命令详解及使用教程
Crontab介绍: Linux crontab是用来crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρ?νο?),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。当安装完成操作系统之后,默认便会启动此任务调度命令。crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。 注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。
天乐404
2023/11/16
7.2K0
Linux中Crontab(定时任务)命令详解及使用教程
Linux命令之crontab
Linux系统上面有很多计划性的工作,比如在某个时间点需要执行某个动作,在Linux中,一般使用crontab命令来实现控制计划任务,通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常设合周期性的日志分析或数据备份等工作。crontab命令是基于crond这个系统服务的,crond服务是安装Linux系统时自动安装的,它会检查当前系统中是否有要执行的任务。
AsiaYe
2019/11/06
2.6K0
Linux命令之crontab
linux下设置定时执行脚本「建议收藏」
1.首先安装所需程序并启动 crontabs是设置周期性被执行的指令
全栈程序员站长
2022/09/09
8040
Linux定时任务命令crontab
阅读文本大概需要3分钟。 0x01:crontab crontab 是一个用于设置周期性被执行的任务工具 周期性执行的任务列表称为Cron Table 0x02:crontab常用参数 -e:编辑该用户的计时器设置 -l:列出该用户的计时器设置 -r:删除该用户的计时器设置 -u<用户名称>:指定要设定计时器的用户名称 0x03:安装crontab yum install crontabs 0x04:crontab服务操作 /sbin/service crond start //启动服务 /sbin/se
BUG弄潮儿
2020/06/12
2.7K0
crontab 转
安装crontab: [root@CentOS ~]# yum install vixie-cron [root@CentOS ~]# yum install crontabs
双面人
2019/04/10
8130
Crontab 定时执行脚本配置
vixie-cron软件包是cron的主程序; crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
hankleo
2021/07/27
1.6K0
Linux 定时服务 crontab
crontab 是Linux上的定时任务,一般我会拿它来备份数据,这次是用它来定时更新 Lets encrypt 的证书。
上山打老虎了
2022/06/14
2K0
Linux 定时任务
crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。
chuchur
2022/10/25
5.1K0
linux定时运行命令脚本——crontab
Linux中,周期执行的任务一般由cron这个守护进程来处理  ps -ef | grep cron 
阳光岛主
2019/02/19
4.5K0
Linux系统Crontab的安装及定时任务的命令详解
很多时候我们的VPS运行脚本或者重启某些软件的时候都需要用到定时功能,这时候就要用到Crontab定时软件了,这里简单的说下安装和使用方法。
逍遥子大表哥
2021/12/17
7K0
使用shell脚本定时采集日志数据到hdfs分布式文件系统
1、首先对linux操作系统的crontab命令进行熟悉和了解: 1、crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。 2、Linux下的任务调度分为两类,系统任务调度和用户任务调度。   a、系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录
别先生
2018/05/16
2.1K0
linux定时执行shell脚本「建议收藏」
很多时候我们有希望服务器定时去运行一个脚本来触发一个操作,比如说定时去备份服务器数据、数据库数据等 不适合人工经常做的一些操作这里简单说下
全栈程序员站长
2022/10/03
5.8K0
linux定时执行shell脚本「建议收藏」
linux 的定时任务crontab
背景: 本人博客的评论为 valine 评论,为了及时知道评论,设置了邮件通知。奈何 leancloud 的每天活跃状态为 16 小时,且半小时内无人访问,则自动进入休眠状态。为了解决这一问题,研究了下 linux 系统自带的 crontab 定时器,通过 定时访问评论网站 去解决这一问题。 一、认识 crond 服务基本命令 1>安装 crontab: yum install crontabs 2>查看 crontab 服务状态: service crond status 3>手动启动 crontab
leader755
2022/03/09
4.1K0
linux 的定时任务crontab
【linux命令讲解大全】194.掌握Linux定时任务调度:深入解析crontab命令及其使用技巧
crontab 命令用于提交和管理用户的周期性执行任务,类似于 Windows 下的计划任务。在安装完成操作系统后,默认会安装此服务工具,并自动启动 crond 进程。crond 进程每分钟会定期检查是否有要执行的任务,并自动执行。
全栈若城
2024/03/02
6080
定时任务之crontab命令
  2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置
那一叶随风
2018/09/27
1.3K0
定时任务之crontab命令
Linux中的计划任务—Crontab调度重复执行的任务
本博文的主要目的是让笔者和读者可以了解并掌握以下内容: 1、Crontab的基本概念 2、Crontab的基本组成 3、操作Crond服务 4、配置系统和用户计划任务 5、监控计划任务日志
小小工匠
2021/08/16
1.3K0
Linux系统实现定时重启服务器
1. 登录服务器 image.png 2. 可以利用crontab添加定时任务,设置重启,root用户可以在当前root目录下创建文件夹cron(mkdir cron) image.png 3. 通过cd cron命令进入创建的cron目录,通过touch restart 命令创建一个例如为restart的文件 image.png 4. 通过vim restart 命令进入文件中编辑 image.png 5. 在restart文件中编辑定时重启的命令,例如每天18点20分重启,则是需要输入18 18 * *
逸轩
2021/11/19
12.7K0
Linux Crontab 定时任务
cron 系统调度进程。 可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段运行。cron是系统主要的调度进程,可以在无需人工干预的情况下运行作业。
红目香薰
2022/11/29
6.1K0
Linux Crontab 定时任务
推荐阅读
相关推荐
Linux服务器使用Crontab控制定时任务
更多 >
LV.4
这个人很懒,什么都没有留下~
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档