零基础快速上手HarmonyOS ArkTS开发5---从简单的页面开始2---使用List组件 ...

张裕  金牌会员 | 2024-9-28 00:09:40 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 509|帖子 509|积分 1527

接着继承往放学习页面布局的知识。最近发现之前学习这一章节的内容在官方已经被下了,替换成了另外一个案例了( https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717497398588123):
     

     而且整个视频的风格也不一样了,先看看之前的这个美女讲师:
     

     再看看如今的:
     

     哇塞,档次一看就不一样了,新的肯定是佳构,但是我这章学习才刚开始绘了个静态的登录界面呀,就想让我直接放弃治疗了~~只能说我学得如蜗牛般快,跟不上官方的步调。
     还幸亏B站上搜到了当时整个系列的课程: https://space.bilibili.com/1785849877/channel/seriesdetail?sid=3844174
     这也挺好,等我把旧的学完,再以最新的这个案例再举行巩固加深~~
     在上一次搭建好登录的界面之后,这次则在登录界面成功之后,再来构建一下我的设置界面:
     

     其焦点是学习List组件的使用。
     List组件先容:

     List组件一样平常和子组件ListItem一起使用,按照垂直或水平方向线性排列。
     接口:

     List(value?:{space?: number | string, initialIndex?: number, scroller?: Scroller})
     入参1:space设置列表间距;
     入参2: initialIndex设置当前List初次加载时起始位置表现的item;
     入参3:scroller控制器,可以控制组件的滚动;
     属性:

     

     关于这块的更多属性可以参考官方api文档: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-container-list-V5
     循环渲染(ForEach)先容:

     由于列表是有多个列表项,以是构建列表需要使用ForEach举行循环渲染,先看一下它的界说:
     

     参数1:arr为需要迭代的数组;
     参数2:itemGenerator为子组件天生函数;
     参数3: keyGenerator为数组项唯一键值天生函数,它是一个可选项参数,但是为了使开发框架可以或许更好地辨认数组更改,提高性能,发起提供该参数。
     使用List组件构建列表:

     接下来看一下List组件详细的构建步调。
     1、界说列表数据对象:用于封装列表项数据

     

     它由三个元素组件:一个图标,一个标题,一个菜单的状态(单选开关,照旧向右的可点击的),以是可以界说如下对象:
     

     2、创建列表数据数组:为列表创建数据源

     

     3、创建列表Item内容:构建列表项组件

     接下来则需要来构建Item组件了,此时就需要使用到@Builder装饰器了(关于它可以参考上一篇),
     

     这块的代码比较好理解,就不过多说明。
     4、使用ForEach构建列表: 遍历数据源渲染列表项

     最后就是来完成整个列表的渲染了,如下:
     

     5、List实践:

     理论基础学完了之后,接下来则回到代码中来实现这么一个列表界面。
     1、登录按钮增长点击事件:

     在上一次搭建了一个登录的静态界面,这里先给登录按钮添加一个点击事件,登录之后再跳到既将要搭建的列表界面:
     

     

     起首需要判断用户名和暗码是否输入了,假如用户没输入则给个非常提示,这里则需要界说两个装饰变量:
     

     而关于这个装饰器的作用可以参考,然后在文本输入框中需要添加文本的监听,如下:
     

     此时就可以举行登录参数简单校验了: 
     

     此时运行看一下:
     

     这里的登录就用延时来模拟一下了,由于登录是一个需要耗时的操纵,所有应该展示一个loading给用户举行等待,以是先界说一个loading的状态变量:
     

     

     此时运行看一下:
     

     接下来则新建一个首页用来举行登录跳转:
     

     此时要注意了,需要在这里注册一下:
     

     此时就可以举行路由跳转了:
     

     其中router需要导入包:
     

     此时运行看一下结果:
     

     2、搭建我的列表界面:

     1、标题处置惩罚:

     

     起首用一个Scroll包裹一下,因为设置项通常的内容会超过一屏,以是需要让用户可以上下滑动:
     

     然后团体是垂直排列的,以是用Column包裹一下:
     

     然后弄一个标题文本控件:
     

     此时运行看一下:
     

     另外设置一下页面背景和左右间距:
     

     此时运行,发现标题居中表现了:
     

     此时需要在Text元素外面再包裹一层:
     

     再运行:
     

     2、用户明细地区:

     

                                   登录后复制                        
  1. /* 用户明细区域 */
  2.         Row() {
  3.           Image($r('app.media.account'))
  4.             .width($r('app.float.setting_account_size'))
  5.             .height($r('app.float.setting_account_size'))
  6.           Column() {
  7.             Text($r('app.string.setting_account_name'))
  8.               .fontSize($r('app.float.setting_account_fontSize'))
  9.             Text($r('app.string.setting_account_email'))
  10.               .fontSize($r('app.float.little_text_size'))
  11.               .margin({ top: $r('app.float.setting_name_margin') })
  12.           }
  13.           .alignItems(HorizontalAlign.Start)
  14.           .margin({ left: $r('app.float.setting_account_margin') })
  15.         }
  16.         .margin({ top: $r('app.float.setting_account_margin') })
  17.         .alignItems(VerticalAlign.Center)
  18.         .width(CommonConstants.FULL_PARENT)
  19.         .height($r('app.float.setting_account_height'))
  20.         .backgroundColor(Color.White)
  21.         .padding({ left: $r('app.float.setting_account_padding') })
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
                       此时运行看一下:
     

     再设置一下地区的圆角:
     

     

     3、准备列表数据:

     接下来则需要来搭建开关列表了,这里先来准备好列表的数据,这里先新建一个viewmodel文件夹:
     

     然后新建一个列表类:
     

                                   登录后复制                        
  1. /**
  2. * List item data entity.
  3. */
  4. export default class PageResource {
  5.   /**
  6.    * Text of list item.
  7.    */
  8.   title: Resource;
  9.   /**
  10.    * Image of list item.
  11.    */
  12.   img: Resource;
  13.   /**
  14.    * Other resource of list item.
  15.    */
  16.   others?: Resource;
  17.   constructor(title: Resource, img: Resource, others?: Resource) {
  18.     this.title = title;
  19.     this.img = img;
  20.     this.others = others;
  21.   }
  22. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
                       然后就可以准备列表数据了,如下:
     

                                   登录后复制                        
  1. import ItemData from './ItemData';
  2. /**
  3. * Binds data to components and provides interfaces.
  4. */
  5. export class MainViewModel {
  6.   /**
  7.    * Get data of the setting list.
  8.    *
  9.    * @return {Array<PageResource>} settingListData.
  10.    */
  11.   getSettingListData(): Array<ItemData> {
  12.     let settingListData: ItemData[] = [
  13.       new ItemData($r('app.string.setting_list_news'), $r('app.media.news'), $r("app.string.setting_toggle")),
  14.       new ItemData($r('app.string.setting_list_data'), $r('app.media.data')),
  15.       new ItemData($r('app.string.setting_list_menu'), $r('app.media.menu')),
  16.       new ItemData($r('app.string.setting_list_about'), $r('app.media.about')),
  17.       new ItemData($r('app.string.setting_list_storage'), $r('app.media.storage')),
  18.       new ItemData($r('app.string.setting_list_privacy'), $r('app.media.privacy'))
  19.     ];
  20.     return settingListData;
  21.   }
  22. }
  23. export default new MainViewModel();
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
                       4、选项开关地区:

     此时咱们就可以这次新学的List组件来搭建列表界面了,如下:
     

     运行看一下:
     

     发现这块没有间距:
     

     这里可以加一个间距,如下:
     

     

     接下来再来对列表项举行一个渲染:
     

     此时运行:
     

     这个开关应该是居右的,这里又需要使用到flex布局了,如下:
     

     这里需要用到上节所学的知识了,主轴方向上的对齐则需要使用justifyContent:
     

     此时再运行:
     

     最后,对于这个列表的渲染可以使用@Builder装饰器举行一下组件的封装,如下:
     

     

     4、退出登录:

     最后再弄一个退出登录的按钮:
     

     此时运行一下:
     

     应该它的位置是在底部,那怎么调解一下呢?此时Blank()的本领就可以派上用场了:
     

     这块在上一节中也使用到了:
     

     此时再运行就如预期了:
     

     Grid组件先容:

     对于这个页面,它就是由Grid组件来实现的:
     

     它是一种网格容器,由“行”和“列”所分割的单元格构成,我们通过指定差异“项目”所在的单元格就可以做出各种各样的布局。
     界说:

     

     其中它跟List组件雷同,需要搭配着子组件GridItem来使用,其实现在最新的参数有2个了:
     

     这块未来用到再说,现在先团体把官方的教程给学完。
     属性:

     重要属性如下:
     

     下面详细来学习一下。
     columnsTemplate:

     当我们不设置时,默认是1列,它使用的单位是fr,fr是划分网格的,例如'1fr 1fr 2fr'是将父组件分3行,将父组件答应的高分为4等份,第一行占1份,第二行占一份,第三行占2份,如下:
     

     rowsTemplate:

     这个也很好理解,假如设置成“1fr 2fr 1fr”时,其样式就是如许:
     

     columnsGap:

     它是用来设置列的间距,如橘黄色所示:
     

     rowsGap:

     它则是用来设置行的间距:
     

     使用Grid组件构建网格:

     相识了Grid组件的基本使用之后,下面来看这么一个界面如何使用它来举行构建:
     

     界说数据对象:

     网格布局中的每一项内容是由两部分构成:
     

     以是可以界说如下:
     

     创建网格数据数组:

     接下来再来初始化网格数据数组:
     

     构建列表:

     其构建细节跟之前的List组件雷同,如下: 
     

     好比好理解。
     构建可滚动的网格:

     在上面实现的网格内容是不能滚动的,那有时是需要固定高宽,其多余的内容需要可以或许滚动展示,以是下面来看一下如何来实现,这里照旧以这个网格结果为例让其支持上下滑动。
     1、将rowsTemplate给去掉,因为要上下可滑动则不需要设置它了:

     

     也就是:
     

     2、在源数据中再增长两个测试数据,此时展示的样式就如下:

     

     其中新加的两个测试数据会填充到地区外,此时就可以通过上下滑动举行展示了。
     Grid实践:

     接下来则继承基于项目的代码来练一练Grid,来实现首页的这么一个结果:
     

     1、备份MainPage.ets文件:

     由于现在咱们还没有学习Tabs如许的控件(将在下一篇来学习),以是这里将MainPage.ets实现的我的页面的文件给备份一下:
     

     将此次操练的内容照旧写在MainPage.ets当中,等下次学习了Tabs控件之后,再将“我的”和“首页”两页面的内容串联起来,实现跟官方一样的结果,一步步来。
     2、准备标题:

     

     

     3、准备Swiper广告轮播的数据:

     起首实现的是顶部的广告轮播:
     

     先来准备一下广告的数据:
     

                                   登录后复制                        
  1. /**
  2.    * Get swiper image data.
  3.    *
  4.    * @return {Array<Resource>} swiperImages.
  5.    */
  6.   getSwiperImages(): Array<Resource> {
  7.     let swiperImages: Resource[] = [
  8.     $r('app.media.fig1'),
  9.     $r('app.media.fig2'),
  10.     $r('app.media.fig3'),
  11.     $r('app.media.fig4')
  12.     ];
  13.     return swiperImages;
  14.   }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
                       4、表现广告轮播:

     

     运行一下:
     

     布局有点标题,高度撑满整个屏幕高度了。。这里其实是这个属性造成的:
     

     将其去掉一下:
     

     

     高度是可以了,但是居中了,我想要让它顶部对齐调了半天木调好,最后这么调解了一下:
     

     再运行:
     

     5、表现Grid分类:

     接下来来搭建这块的地区:
     

     1、准备分类数据:

     先来准备分类的数据:
     

                                   登录后复制                        
  1. /**
  2.    * Get data of the first grid.
  3.    *
  4.    * @return {Array<PageResource>} firstGridData.
  5.    */
  6.   getFirstGridData(): Array<ItemData> {
  7.     let firstGridData: ItemData[] = [
  8.       new ItemData($r('app.string.my_love'), $r('app.media.love')),
  9.       new ItemData($r('app.string.history_record'), $r('app.media.record')),
  10.       new ItemData($r('app.string.message'), $r('app.media.message')),
  11.       new ItemData($r('app.string.shopping_cart'), $r('app.media.shopping')),
  12.       new ItemData($r('app.string.my_goal'), $r('app.media.target')),
  13.       new ItemData($r('app.string.group'), $r('app.media.circle')),
  14.       new ItemData($r('app.string.favorites'), $r('app.media.favorite')),
  15.       new ItemData($r('app.string.recycle_bin'), $r('app.media.recycle'))
  16.     ];
  17.     return firstGridData;
  18.   }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
                       2、定制布局:

     

     其中对于Grid这个组件有一些关键属性,可以参考上面,这里也贴一下:
     

     此时运行看一下:
     

     木有圆角结果呀,这需要加一个背景就可以了:
     

     6、列表表现:

     1、先准备列表数据:

     

     2、准备标题:

     

     运行看一下:
     

     左边少了间距,这块在之前会统一举行padding的设置的。
     3、列表表现:

     接下来处置惩罚列表的表现,照旧使用Grid组件,如下:
     

                                   登录后复制                        
  1. Grid() {
  2.           ForEach(mainViewModel.getSecondGridData(), (secondItem: ItemData) => {
  3.             GridItem() {
  4.               Column() {
  5.                 Text(secondItem.title)
  6.                   .fontSize($r('app.float.normal_text_size'))
  7.                   .fontWeight(FontWeight.Medium)
  8.                 Text(secondItem.others)
  9.                   .margin({ top: $r('app.float.home_list_margin') })
  10.                   .fontSize($r('app.float.little_text_size'))
  11.                   .fontColor($r('app.color.home_grid_fontColor'))
  12.               }
  13.               .alignItems(HorizontalAlign.Start)
  14.             }
  15.             .padding({ top: $r('app.float.home_list_padding'), left: $r('app.float.home_list_padding') })
  16.             .borderRadius($r('app.float.home_backgroundImage_borderRadius'))
  17.             .align(Alignment.TopStart)
  18.             .backgroundImage(secondItem.img)
  19.             .backgroundImageSize(ImageSize.Cover)
  20.             .width(CommonConstants.FULL_PARENT)
  21.             .height(CommonConstants.FULL_PARENT)
  22.           }, (secondItem: ItemData) => JSON.stringify(secondItem))
  23.         }
  24.         .width(CommonConstants.FULL_PARENT)
  25.         .height($r('app.float.home_secondGrid_height'))
  26.         .columnsTemplate('1fr 1fr')
  27.         .rowsTemplate('1fr 1fr')
  28.         .columnsGap($r('app.float.home_grid_columnsGap'))
  29.         .rowsGap($r('app.float.home_grid_rowGap'))
  30.         .margin({ bottom: $r('app.float.setting_button_bottom') })
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
                       运行看一下:
     

     其中可以看到,团体的左右边距都没有设置不好看,以是这里统一设置一下:
     

     再次运行:
     

     总结:

     这次重要是学习了学用的List和Grid组件的使用,比较简单,这块的纯熟就是通过大量的练习,没有其它本领。在下次,则会使用Tabs组件,将之前所学的两个首页和我的页面举行一个串联,来实现官方的DEMO一模一样的结果,加油~~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表