当前位置:网站首页>【Harmony OS】【ArkUI】ets开发 基础页面布局与数据连接
【Harmony OS】【ArkUI】ets开发 基础页面布局与数据连接
2022-08-09 04:44:00 【华为开发者论坛】
前言:本篇是以HarmonyOS官网的基于TS扩展的声明式开发范式文档,页面布局与连接为基础进行编写。尽管原篇已非常精简,但是作为初学者想要快速入门,使用ets方式实现出List布局、Grid布局、数据连接及页面跳转功能,还是稍显晦涩。所以笔者将原文进行整合,提取出其中的要点,以便通俗易懂地呈现给读者,希望能帮助你快速了解Harmony的ETS开发,学会简单的布局与数据连接。本篇最后会贴上参考原文链接。
首先讲一下大致的思路,我们要实现一个简单的List页面布局、一个简单的Grid页面布局,点击页面右上角的按钮可以进行两个布局页面的跳转。List布局和Grid布局中的每个item都对应着一条数据,并且也可以进行点击跳转到简单的detail页面。所以笔者将整个功能的实现分为了四个步骤,构建数据模型、构建列表List布局、构建列表Grid布局、页面跳转与数据传递,这与原篇大致相同。
1. 构建数据模型。
做菜首先需要备菜,数据模型是整个程序的内容,我们需要先准备好。但是因为我们是快速入门,就不需要细究细节,只要符合大概的逻辑即可。
这次我们需要准备的数据模型是食物数据模型,每个食物有食物名称、卡路里、蛋白质、脂肪、碳水和维生素C的字段。
1) 新建model文件夹,在model目录下创建FoodData.ets。
2) 定义食物数据的存储模型FoodData和枚举变量Category,FoodData类包含食物id、名称(name)、分类(category)、图片(image)、热量(calories)、蛋白质(protein)、脂肪(fat)、碳水(carbohydrates)和维生素C(vitaminC)属性。
*eTS语言是在ts语言的基础上的扩展,同样支持ts语法。
3) 存入食物图片资源。在resources > base > media目录下存入食物图片资源,笔者这里不究细节,就只用一个icon.png代替了。
4) 创建食物资源数据。在model文件夹下创建FoodDataModels.ets,在该页面中声明食物成分数组FoodComposition。
以12个食物数据为例,实际开发中,开发者可以自定义更多的数据资源,当食物资源很多时,建议使用数据懒加载LazyForEach。以下营养数据均来自网络。
创建initializeOnStartUp方法来初始化FoodData的数组。在FoodDataModels.ets中使用了定义在FoodData.ets的FoodData和Category,所以要将FoodData.ets的FoodData类export,在FoodDataModels.ets内import FoodData和Category。
2. 构建列表List布局。
数据是整个程序的内容与血肉,页面布局则是整体的框架和骨骼。现在数据模型已经准备好,开始搭建整个程序的框架和构建整体的页面布局。
首先构建一个List列表布局,使用List组件和ForEach循环渲染。这里的List列表就和Android中的ListView有一点相似,大致的功能就是我们日常使用的APP的下拉列表。
1) 在pages目录新建页面FoodCategoryList.ets,将index.ets改名为FoodDetail.ets,并将其添加到config.json文件下的pages标签,位于第一序位的页面为首页。
2) FoodCategoryList.ets引入FoodData类和initializeOnStartup方法。
3) 新建FoodList组件作为页面入口组件,FoodListItem为其子组件。List组件是列表组件,适用于重复同类数据的展示,其子组件为ListItem,适用于展示列表中的单元。
4) 给FoodListItem添加一些细节。添加图片和内容。
5) 给FoodList添加一些细节。添加标题,引入ForEach循环渲染每一条item。
6) 打开模拟器或者预览器,即可查看实现的List列表的效果。
3. 构建列表Grid布局。
上面我们使用ets开发实现了List列表的功能,接下来我们使用ets来开发实现Grid列表。Grid列表其实就是网格列表功能,和Android中的GridView有点类似。
页面布局上可以提供给用户两种显示方式:列表显示和网格显示,实现通过页签切换不同分类的列表和网格布局。
1) 将Category枚举类型引入FoodCategoryList页面,并且将原来引入FoodData的类注释掉。
2) 新建FoodGrid组件作为页面入口组件,FoodGridItem为其子组件。Grid组件是网格组件,适用于重复同类数据的展示,其子组件为GridItem,适用于展示列表中的单元。
3) 给FoodGridItem添加一些细节。展示食物图片、名称和卡路里,实现其UI布局,为GridItem的子组件。每个FoodGridItem高度为184,行间距为8,设置Grid总高度为(184 + 8) * 6 - 8 = 1144。
4) 给FoodGrid添加一些细节。实现2 * 6的网格布局(一共12个食物数据资源)。创建Grid组件,设置列数columnsTemplate('1fr 1fr'),行数rowsTemplate('1fr 1fr 1fr 1fr 1fr 1fr'),行间距和列间距rowsGap和columnsGap为8。创建Scroll组件,使其可以滑动。
5) 创建FoodCategoryList和FoodCategory组件,其中FoodCategoryList作为新的页面入口组件,在入口组件调用initializeOnStartup方法。将原来的FoodList类的initializeOnStartup方法和@Entry去除。
6) 给FoodCategory添加一些细节。创建展示蔬菜(Category.Vegetable)、水果(Category.Fruit)、坚果(Category.Nut)、海鲜(Category.SeaFood)和甜品(Category.Dessert)分类的页签。
7) 给FoodCategoryList添加一些细节。在FoodCategoryList组件内创建showList成员变量,用于控制List布局和Grid布局的渲染切换。需要用到条件渲染语句if...else...。在页面右上角创建切换List/Grid布局的图标。设置Stack对齐方式为顶部尾部对齐TopEnd,创建Image组件,设置其点击事件,即showList取反。添加@State装饰器。点击右上角的switch标签后,页面没有任何变化,这是因为showList不是有状态数据,它的改变不会触发页面的刷新。需要为其添加@State装饰器,使其成为状态数据,它的改变会引起其所在组件的重新渲染。
8) 打开模拟器或者预览器,即可查看实现的List列表的效果。点击上面一排tab可以进行标签切换,展示不同标签对应的内容。点击右上角可以进行list和grid的切换。
4. 页面跳转与数据传递。
上面我们已经完成了页面布局的搭建和读取数据模型,接下来需要实现页面跳转和数据传递的功能。其实在上面两个页面布局切换就已经用到了页面跳转,这次要实现的是list和grid的item点击时跳转到详情界面,还有页面跳转时的数据传递功能。
页面跳转:点击食物分类列表页面的食物条目后,跳转到食物详情页;点击食物详情页的返回按钮,返回到食物列表页。
页面间数据传递:点击不同的食物条目后,FoodDetail接受前一个页面的数据,渲染对应的食物详情页。。
1) 点击FoodListItem后跳转到FoodDetail页面。在FoodListItem内创建Navigator组件,使其子组件都具有路由功能,目标页面target为'pages/FoodDetail'。
点击FoodGridItem后跳转到FoodDetail页面。调用页面路由router模块的push接口,将FoodDetail页面推到路由栈中,实现页面跳转。使用router路由API接口,需要先引入router。
这我们在上面都已添加,只需要再引入router。
2) 在FoodDetail页面增加回到食物列表页面的图标。在resources > phone > media文件夹下存入回退图标Back.png。新建自定义组件PageTitle,包含后退的图标和Food Detail的文本,调用路由的router.back()接口,弹出路由栈最上面的页面,即返回上一级页面。
3) 在FoodDetail组件内创建Stack组件,包含子组件FoodImageDisplay和PageTitle子组件,设置其对齐方式为左上对齐TopStart。
4) FoodDetail页面router模块,引入FoodData类,在FoodDetail组件内添加foodItem成员变量。
5) 重构FoodDetail页面的组件。创建FoodImageDisplay类和ContentTable类,用于图片和内容展示。
6) 打开模拟器或者预览器,即可查看实现的List列表的效果。
以上,本次的内容分享,谢谢!
参考原文链接:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-ts-building-data-model-0000001146785866
欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh
边栏推荐
- "IP" command to configure network interface
- pr22.5最新版下载地址
- OKR management process, how to implement effective dialogue, using the CFR feedback and recognition?
- Divisible property 1
- MySQL:redo log日志——笔记自用
- 基因对疾病的影响规律--读论文
- leetcode:316. 去除重复字母
- LeetCode-从链表中删去总和值为零的连续结点
- [math] dot product and cross product
- MySQL: Implementation Principles of Submitted Read and Repeatable Read | MVCC (Multi-Version Concurrency Control) - Notes for Your Own Use
猜你喜欢
阿里云天池大赛赛题(机器学习)——工业蒸汽量预测(完整代码)
etcd Study Notes - Getting Started
Alibaba Cloud Tianchi Contest Question (Machine Learning) - Prediction of Industrial Steam Volume (Complete Code)
Introduction to JVM garbage collection mechanism
稳定性测试怎么做,这篇文章彻底讲透了!
杰理之一拖二 另一台手机超距 通话会无声【篇】
2022年安全员-A证特种作业证考试题库及在线模拟考试
Improve the user experience and add a small detail to your modal popup
必须指定GDAL API版本。提供一个路径使用GDAL_CONFIG gdal-config环境
Crosstalk and Protection
随机推荐
【ITRA】2022年ITRA赛事注册流程 从0-1
I.MX6U-ALPHA开发板(串口实验)
761. 特殊的二进制序列(分治)
Detailed explanation of Oracle's windowing function
leetcode:315. 计算右侧小于当前元素的个数
容易混淆的指针知识点
杰理之ANC OFF语音没有作用【篇】
阿里云天池大赛赛题(机器学习)——工业蒸汽量预测(完整代码)
Crosstalk and Protection
自动化测试的生命周期是什么?
JS-全局dom对象的使用---使用htm样式和js函数动作的完全分离
2022下半年深圳信息系统项目管理师认证招生简章
【暑期每日一题】洛谷 P1176 路径计数2
337. Robbery III
Ali YunTianChi competition problem (deep learning) - video enhancement (complete code)
分布式数据库怎样才能“叫好又卖座”
自动化测试-图片中添加文字注释,添加到allure测试报告中
Gopacket source code analysis
ceph创建存储池,映射,删除练习
OKR管理过程中,如何运用CFR实现组织的高效对话、反馈和认可?