「Mac畅玩鸿蒙与硬件16」鸿蒙UI组件篇6 - List和Grid组件展示数据列表

简介: List 和 Grid 是鸿蒙开发中的核心组件,用于展示动态数据。List 适合展示垂直或水平排列的数据列表,而 Grid 则适用于展示商品或图片的网格布局。本篇将展示如何封装组件,并通过按钮实现布局切换,提升界面的灵活性和用户体验。

List 和 Grid 是鸿蒙开发中的核心组件,用于展示动态数据。List 适合展示垂直或水平排列的数据列表,而 Grid 则适用于展示商品或图片的网格布局。本篇将展示如何封装组件,并通过按钮实现布局切换,提升界面的灵活性和用户体验。

20241031_005905.gif


关键词
  • List 组件
  • Grid 组件
  • 数据展示
  • 自定义列表项
  • 布局切换
  • 删除功能
  • 动态加载

一、List 组件基础

1.1 基本用法

List 组件通过 @State 数据渲染一个基础的纵向列表。

@Entry
@Component
struct ListExample {
   
  @State items: string[] = ['Item 1', 'Item 2', 'Item 3']; // 初始化数据

  build() {
   
    Column() {
   
      List() {
   
        // 遍历数据并渲染每个列表项
        ForEach(this.items, (item: string) => {
   
          ListItem() {
   
            Text(item) // 显示文本
              .fontSize(28) // 设置字体大小
              .padding(20); // 设置内边距
          }
        });
      }
    }
    .width('100%') // 设置列宽为 100%
    .height('100%') // 设置列高为 100%
    .justifyContent(FlexAlign.Center); // 子项垂直居中对齐
  }
}

效果示例
Screenshot_2024-10-31T005611.png


1.2 设置列表方向

通过 listDirection 设置列表的滚动方向。

List() {
   
  ForEach(this.items, (item: string) => {
   
    ListItem() {
   
      Text(item) // 显示文本
        .fontSize(28)
        .padding(20); // 设置内边距
    }
  })
}
.listDirection(Axis.Horizontal); // Axis.Horizontal 可实现横向滚动;Axis.Vertical 可实现纵向滚动

1.3 添加分隔线

为列表项添加分隔线,提高视觉层次感。

List() {
   
  ForEach(this.items, (item: string) => {
   
    ListItem() {
   
      Text(item)
        .fontSize(28)
        .padding(20); // 设置内边距
    }
  })
}
.divider({
    color: Color.Blue, strokeWidth: 1 }); // 蓝色分隔线

二、封装 LightItem 组件

将灯具的图片和名称封装为 LightItem 组件,供 List 和 Grid 使用。组件通过 @Prop 接收数据,并在按钮点击事件中执行删除操作。

@Component
export struct LightItem {
   
  @Prop item: number; // 灯具 ID

  build() {
   
    Column() {
   
      // 显示灯具图片
      Image($r(`app.media.light_on_${
     this.item}`))
        .width(100) // 设置图片宽度
        .height(100); // 设置图片高度

      // 显示灯具名称
      Text(`灯${
     this.item}`)
        .fontSize(18) // 设置字体大小
        .fontWeight(FontWeight.Bold) // 加粗
        .padding(10); // 设置文本内边距

      Button('删除') // 删除按钮
        .backgroundColor(Color.Red) // 按钮背景色
        .fontColor(Color.White); // 按钮文字颜色
    }
    .padding(10); // 设置组件外边距
  }
}

三、实现布局切换

新增一个按钮,通过点击按钮在 List 和 Grid 两种布局之间切换。删除功能则在父组件中实现。

import {
    LightItem } from './LightItem'; // 导入 LightItem 组件

@Entry
@Component
struct LayoutSwitcherExample {
   
  @State items: Array<number> = [1, 2, 3, 4, 5, 6]; // 初始化数据
  @State isGridLayout: boolean = false; // 控制布局状态

  // 切换布局的方法
  toggleLayout() {
   
    this.isGridLayout = !this.isGridLayout;
  }

  // 删除列表项的方法
  deleteItem(item: number) {
   
    this.items = this.items.filter(i => i !== item); // 从列表中移除当前项
  }

  build() {
   
    Column() {
   
      // 布局切换按钮
      Button(this.isGridLayout ? '切换到列表布局' : '切换到网格布局')
        .onClick(() => this.toggleLayout()) // 切换布局状态
        .padding(10) // 设置按钮内边距
        .backgroundColor(Color.Gray) // 设置按钮背景颜色
        .fontColor(Color.White); // 设置按钮文字颜色

      // 根据状态动态渲染布局
      if (this.isGridLayout) {
   
        Grid() {
   
          ForEach(this.items, (item: number) => {
   
            GridItem() {
   
              Column() {
   
                LightItem({
    item: item }) // 渲染 LightItem 组件
                  .onClick(() => this.deleteItem(item)) // 删除项
              }
            }
          });
        }
        .columnsTemplate('1fr 1fr') // 每行两列
        .columnsGap(10) // 设置列间距
        .rowsGap(10); // 设置行间距
      } else {
   
        List() {
   
          ForEach(this.items, (item: number) => {
   
            ListItem() {
   
              Column() {
   
                LightItem({
    item: item }) // 渲染 LightItem 组件
                  .onClick(() => this.deleteItem(item)) // 删除项
              }
            }
          });
        }
        .listDirection(Axis.Horizontal); // 设置为横向滚动
      }
    }
    .width('100%') // 设置宽度
    .height('100%') // 设置高度
    .alignItems(HorizontalAlign.Center) // 子项水平居中
    .justifyContent(FlexAlign.Center); // 子项垂直居中
  }
}

四、常见问题与优化

  1. 性能优化

    • 使用分页加载或虚拟滚动,避免大数据列表导致的性能问题。
  2. 状态同步问题

    • 通过 @State 和 @Prop 保持数据同步,确保界面状态及时更新。
  3. 布局调整

    • 根据实际需求调整 List 和 Grid 的样式,使界面更美观。

小结

本篇展示了如何封装 LightItem 组件,并通过按钮实现 List 和 Grid 布局的动态切换。通过合理的组件封装和状态管理,实现了灵活的界面布局和高效的用户交互。


下一篇预告

下一篇将介绍 Dialog 组件,展示如何创建对话框并实现交互功能。


上一篇: 「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider和Progress组件

下一篇: 「Mac畅玩鸿蒙与硬件17」鸿蒙UI组件篇7 - Animation组件基础


作者:SoraLuna
链接:https://www.nutpi.net/thread?topicId=233
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


目录
相关文章
|
存储 UED 开发者
30.[HarmonyOS NEXT Column案例八(上)] 构建现代聊天界面:层叠布局与消息列表的实现
在HarmonyOS NEXT应用开发中,聊天界面是一种常见且复杂的界面类型,它需要展示消息列表、输入区域以及各种交互元素。本教程将详细讲解如何使用Column组件作为主容器,结合Stack组件实现层叠布局,创建一个现代化的聊天界面。通过ChatPage组件的实际案例,我们将展示如何构建包含消息列表和输入区域的复合布局,帮助开发者掌握复杂布局的实现技巧。
257 5
|
开发者 容器
44.[HarmonyOS NEXT RelativeContainer案例一] 掌握组件锚点布局:打造灵活精准的UI定位系统
在HarmonyOS NEXT的UI开发中,精确控制组件位置是构建复杂界面的关键。RelativeContainer作为一种强大的布局容器,通过锚点系统提供了精确定位能力,使开发者能够创建出灵活且精准的UI布局。本教程将详细讲解如何使用RelativeContainer的锚点布局功能,帮助你掌握这一核心技术。
446 4
|
设计模式 容器
13.HarmonyOS流式卡片列表实现指南:Flex多行布局详解
在现代移动应用开发中,流式卡片列表是一种常见且实用的UI设计模式。它能够自适应屏幕宽度,在有限空间内高效展示多个内容项。本教程将详细讲解如何使用HarmonyOS的ArkUI框架中的Flex组件实现一个灵活的流式卡片列表,重点关注多行布局与对齐策略的应用。
514 2
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
815 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
JavaScript 前端开发 UED
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发四
本文介绍了Web组件开发与性能优化的相关内容。在Web组件开发部分,涵盖创建组件、设置样式与属性、添加事件和方法以及场景示例,如动态播放视频。性能提升方面,推荐使用数据懒加载、条件渲染替代显隐控制、Column/Row替代Flex、设置List组件宽高及调整cachedCount减少滑动白块等方法,以优化应用性能与用户体验。
431 56
|
JavaScript 前端开发 开发者
鸿蒙应用开发从入门到实战(六):ArkTS声明式UI和组件化
鸿蒙开发语言ArkTS在继承了Typescrip语法的基础上,主要扩展了声明式UI开发相关的能力。
512 1
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
720 55
|
Linux Go iOS开发
IDA 9.2 发布:Golang 改进、新 UI 组件、类型解析等
IDA Pro 9.2 (macOS, Linux, Windows) - 强大的反汇编程序、反编译器和多功能调试器
1761 0
|
Web App开发 前端开发 JavaScript
Element UI框架中自定义input组件的placeholder样式。
确保这些样式在你的应用程序CSS文件中定义,且该文件已正确加载到项目中。通过以上方法,可以控制Element UI组件中input的placeholder样式,使其满足特定的设计要求。这些更改都是基于CSS伪元素进行的,因此并不会对DOM结构产生改变,保持了原有结构的简洁和高效。
993 12
|
移动开发 开发者
仓颉开发语言入门教程:常见UI组件介绍和一些问题踩坑
仓颉开发语言即将发布一周年,虽已有知名App应用,但教程稀缺且官网文档不够完善。幽蓝君推出系列教程,从零开始系统讲解移动开发。本期介绍常用UI组件:按钮、文本、图片、输入框与搜索框的使用方法及注意事项,帮助开发者快速上手仓颉语言。