鸿蒙应用开发从入门到入行 - 篇 3:ArkUI 布局基础与制作可交互页面
鸿蒙应用开发从入门到入行
第三天 - 登录案例、事件、双向绑定、装饰器
导读:在本篇文章里,您将掌握事件、装饰器、双向绑定等相关知识,并利用所学知识做一个待办列表的案例。
练手案例:登录界面
开始之前,先说些题外话
猫林老师发现不少同学可以独立写出来,我很欣慰。说明行动力、悟性、之前前端留下的布局思想都还在。希望各位同学和更多的朋友们都能参与进来。大家以后写完可以把自己的代码或者效果贴到评论区相互讨论。讨论的人越多越有学习氛围,在这里大家都可以找到志同道合的人。并且,每一次热烈的讨论都能激励猫林老师更认真迅速地去写下一篇文章。
而且写教程文真的很需要花费额外时间,那就会挤占猫林老师想做爱做的事的时间😊。而且纯爱心发电其实动力并不足,所以也真的很需要各位读者提供热烈的正向回馈来激励猫林老师,所以大家请一定要多点赞、收藏、评论。要是可以,也分享给你周围想学鸿蒙的朋友。猫林老师保证把系列文章更新下去,让大家从文章里就能学到真东西,并且具备找工作能力。
好了,话不多说,开始说回上次的作业案例,让我们先回顾一下作业的效果图:
从上图分析可以发现整体上所有内容是从上往下布局,所以用 Column 作为根容器非常合适。
然后里面可以分为 8 行元素,分别为:Image、Text、Text、TextInput、TextInput、Row、Button、Text,如图
这些都是比较容易看出来的布局,主要是给大家解释下
短信验证码登录
和忘记密码
那一行,为什么还要用一个Row
包起来呢?因为如果这两个文字不被 Row 包起来的话,那么父组件是 Column,那短信验证码登录
和忘记密码
就会变成一行一个。所以用一个Row
包起来,因为 Row 有从左到右布局子组件的能力,而这两个文字就需要从左到右,只不过一个在起点,一个在终点(即在首尾),所以这里到时候还可以给它做一个主轴上的布局为SpaceBetween
。其他的无非记得要让根容器
Column
铺满屏幕,也即宽高百分百,图片给宽度、登录界面
给文字大小和加粗,登录帐号以使用更多服务
改文字颜色、文字大小。两个TextInput
给占位符,其中第二个TextInput
记得要把 type 设置为 password。其他剩余的三个 label 都是改文字颜色、字体大小。登录按钮给宽度铺满。然后整个页面是灰色,所以给 Column 设置背景色,再给TextInput
设置背景色为白色。根据上述分析,代码如下
对应效果如下:
此时大家发现两个问题:
明明
短信验证码
那一行的Row
给了justifyContent(FlexAlign.SpaceBetween)
,但没生效,看着还是居中。为什么呢?所有内容行与行之间没有间距,导致挨的太紧。
这两个问题都很好很解决,分别如下
给了
FlexAlign.SpaceBetween
也没生效,是因为猫林老师上节课就说过大部分组件不给宽高就是靠内容撑开宽高,也即内容有大,Row 就只有多大。所以你设置首尾对齐实际上它已经是首尾了,只不过因为 Row 就那么大,所以效果不动
所以解决办法很简答:给 Row 一个
width('100%')
即可行与行之间要设置间距可以给 Column 加
space
因此,改良代码如下(仅写出本次改动部分)
此时效果如下
发现间距是有了,但是中间的账号、密码、短信验证码登录这歌区域跟上面和下面太近,需要把这部分跟上下加一些间距
如上图所示,发现这个时候我们应该把中间这一部分作为一个整体,再统一设置整体的上下外间距即可。因此需要给中间的 2 个
TextInput
和它下面包住两个文字的Row
再套一个父容器。这里请大家思考下,他们的父容器,用Column
好还是Row
好呢?没错,用
Column
好!因为用Row
他们会从左往右排列,而我们依然要它从上到下,只不过多个父容器而已,所以用Column
那分析完加父容器后,还有个问题。怎么设置这个父容器的距离外部的间距呢?会
css
的同学知道,是margin
,没错,ArkTS
里也是margin
(如果不懂什么叫 margin 的请挑战到本文最后的附录:外间距与内间距,再回此继续观看),语法如下
如果你不需要上下左右间距都是同一个值,则可以传入一个对象,分别设置不同的 margin,例
也可以仅设置几个方向的间距,没设置方向的间距代表为 0,例
因此,案例代码里先给中间部分加
Column
,且设置外间距。并且因为中间部分包了 Colum 后,他们各自之间也没间距了,因此给包住验证码登录
文字的 Row 再加一个上间距,TextInput 不用加,因为他们本身就要挨在一起,改动代码如下
此时效果如下
没错,现在跟最终效果图已经差不多了,但是发现左右两边都挨到边边了,而效果图需要左右两边都有点间距。这时候有两种解决办法:
给两个 TextInput、Row、Button 这四行设置左右外间距
给他们共同的父组件设置内间距
很明显,用第二种给共同的父组件设置内间距办法更方便。但是 ArkTS 里如何设置呢?其实还是用
padding
,并且用法跟margin
是一样的,例
因此,再给根组件
Column
设置 padding,且只需要左右间距即可
至此,一个完整的
登录界面
就写完了,你学废了吗?
本案例新知识:
margin: 外间距
padding :内间距
事件
上面的登录案例中,我们目前点
登录按钮
是没有任何反应的。要想让它有反应,必须添加事件,在 ArkTS 中如何添加事件呢?语法
例
注意:上面的 Click 里的 C 大写。后面的事件名如无特殊情况,都是要首字母大写,例如 change 事件,写的时候要加
onChange
,这跟前端里的全小写不一样,大家要注意。e 则是事件对象,但用的略少,不需要时,可以不写 e,替换为小括号
提示框
如果现在,我希望点击按钮后弹出
登录成功
的提示框怎么办呢?ArkUI
里提供了PromptAction
对象,专门用来做弹窗用法:
先导入,再调用
PromptAction
对象的showToast
方法,传入对象,配置提示信息,例
技巧:可以在写代码时,直接写 promptAction,然后出提示后按回车,DevEco 会自动帮你生成导入的代码,如下图
注意:
duration 为提示框多久后消失(也即显示时长),可以不填,不填则默认为 1500,并且最小值也是 1500,最大值是 10000。如果填写的数字小于 1500,也按 1500 来显示,如果大于 10000,也按 10000 来显示。
单位是毫秒,1500 即 1.5 秒
例:
效果如下
更多弹窗的用法可阅读官方文档:点我跳转至官方文档
声明组件内成员变量
很多时候我们这个页面(组件)需要声明一些变量用来保存数据,和对其处理。那么怎么声明呢?
一般会写在
build
函数的上面,struct
关键子下面,即下图位置
语法为:
例:
变量声明好了,如何在代码中使用呢?一律前面加 this 访问,例
双向绑定
学会声明成员变量后,我们在
登录案例
里,声明两个变量,分别叫userId
与userPwd
,专门用来跟账号、密码输入框分别做双向绑定
插播双向绑定: 即数据一旦改变,界面跟着变。 界面输入内容有变化,数据也跟着变。
那么
ArkTS
里如何让数据跟输入框做双向绑定呢?(Next 版本后新增的语法)
接下来让我们把声明的
userId
与userPwd
分别绑定到账号框和密码框
此时保存代码会看到预览器里界面已经能显示绑定的数据了,如图
那我们说双向绑定是:数据 -> 界面, 同样,界面的输入变化也会影响数据,那是否能呢?带着这个疑问,我们先给
登录
按钮加一个点击事件,点击事件里用console.log
输出这两个变量的值。
注意:这里用到了模板字符串,一些同学可能不太理解这种字符串。这里说明一下:首先是用`这个符号包起来,跟单引号双引号都表示字符串,但区别在于模板字符串能很方便做字符串拼接,例如上面的代码,相当于是 '账号:' + this.userId + '密码:' + this.userPwd
然后我们去预览起的界面上重新输入,再点按钮输出,看显示什么(具体看截图,可以看到在哪看 console.log 输出的内容)
小结:
在输入框里,使用成员变量前加
$$
即可双向绑定需注意:
目前
$$
仅能用在基本数据类型且绑定给内置组件
装饰器 - @State
从上面的效果可以看到,已经实现了双向绑定,但此时存在一个问题:数据无法再触发界面更新
例:修改登录的点击事件,在里面我修改
userId
的值,看界面是否能更新
结果如图
原因:默认声明的成员变量不具备数据改变触发界面更新渲染的功能
解决办法:需要使用装饰器
装饰器:
修饰某些数据、函数,使其具有特殊作用
装饰器有很多种,本次学的叫
@State
,注意首字母大写@State 作用:
当被 @State 修饰的变量数据改变时,UI 会发生对应的重新渲染。
用法
让我们测试一下,来到
登录案例
里找到userId
,给它加@State
试试
效果如下图:
但是同样的,加了装饰器后会有轻微的性能开销,即使这种开销甚至可以忽略不计。但是对于对性能优化有要求的
App
而言,则建议。如果数据仅仅只是用来内部参与运算或临时接收界面输入,不需要将来重新更新 UI,就不加@State
装饰器不光只有
@State
,后续还有很多,学一个记一个。小结:
装饰器
修饰数据、函数等,使其具有特殊作用
@State
被 @State 修饰的变量能当它数据改变时,UI 会发生对应的重新渲染
实现登录功能
最后,我们给
登录
案例收个尾,当用户点击登录按钮时,如果输入的账号是admin
,密码是123
,则提示登录成功,否则登录失败(将来学发送请求,如今暂时写死硬判断)代码如下
效果如图:
总结内容
本文中我们学了事件、提示框、成员变量声明、双向绑定、装饰器。我们回顾一下
事件:
on 事件名,事件名首字母大写,例如:onClick、onChange
提示框:
需要先导入
然后使用
技巧:可以直接输入 promptAction,出提示后,按回车,DevEco 会自动导入
声明成员变量
默认情况下,变量改变不会触发界面重新渲染,因此需要装饰器:@State
双向绑定
课后练习
判断题:请回答对或者错
promptAction.showToast 方法,传入 duration 属性,值为 1000,代表提示框在 1 秒后消失
成员变量与输入框双向绑定时,成员变量前面不用加 this
数据如果不加 @State,就不能进行计算
练习答案
错 2. 错 3. 错
(错错错,是我的错。热恋的时候怎么不说,生活的无奈我已好困惑,你能不能不要再啰嗦)--- 请唱出来
附加练习
如上图所示,做一个年度待办目标的列表。
本案例功能比较丰富,各位能做多少做多少。本案例也会贯穿后面好几天的教学,所以涉及非常多新知识,做不出来也正常。
提示:打勾部份可以用 Image 也可以用
Checkbox
,如需要做出布局,需要自行根据文档预习Progress
、Stack
、List
等
互动环节
你觉得鸿蒙开发跟你以前会的开发,区别大吗?欢迎留下你的观点。
最后,创作不易,请不要吝啬您的点赞、关注、收藏、转发!
评论