HarmonyOS应用开发实战:小事记 - List 组件与 ListItem 复用:@Reusable 装饰器与全局复用池
2026/7/20 15:42:38 网站建设 项目流程

前言

List是 ArkUI 中最常用的长列表组件,支持垂直和水平方向的高性能滚动。当列表项数量庞大时,组件复用成为提升性能的关键。HarmonyOS 提供了@Reusable装饰器来实现 ListItem 的复用,并通过cachedCount控制缓存策略。本文以小事记(xiaoshiji_ohos_app) 的WitnessListPage.etsRelatedPeoplePage.ets为分析对象,深入解析 List 组件的复用机制和性能优化。

本文参考 HarmonyOS 官方文档:arkts-common-list-flow.md 和 arkts-component-reusable.md。

一、List 的基本用法

1.1 基本结构

// List 容器的基本结构 List({ space: 12 }) { ForEach(this.items, (item) => { ListItem() { Text(item.name) } }) } .width('100%') .edgeEffect(EdgeEffect.Spring) }

1.2 List 与 Scroll 的对比

对比维度ListScroll
渲染方式懒加载(只渲染可见项)全量渲染
性能适合长列表适合短内容
复用机制支持@Reusable不支持
布局方向垂直/水平垂直/水平/双向
分组支持支持ListItemGroup不支持

二、@Reusable 组件复用

2.1 基本用法

// 定义可复用的列表项组件 @Reusable @Component export struct WitnessItem { @Prop name: string = ''; @Prop relationship: string = ''; @Prop isSelected: boolean = false; aboutToReuse(params: Record<string, Object>): void { // 复用前重置数据 this.name = params.name as string; this.relationship = params.relationship as string; this.isSelected = params.isSelected as boolean; } build() { Row() { Circle().width(44).height(44).fill('#E5E7EB') Column({ space: 2 }) { Text(this.name) .fontSize(15) .fontWeight(FontWeight.Medium) Text(this.relationship) .fontSize(12) .fontColor('#9CA3AF') } .margin({ left: 12 }) Blank() if (this.isSelected) { Circle().width(24).height(24).fill('#7B68EE') } } .width('100%') .height(64) .padding({ left: 20, right: 20 }) } }

2.2 在 List 中使用

// 在 List 中使用可复用的列表项 @Entry @Component export struct WitnessListPage { @State witnesses: Witness[] = getMockWitnesses(); build() { Column() { List() { LazyForEach(new WitnessDataSource(this.witnesses), (witness: Witness) => { ListItem() { WitnessItem({ name: witness.name, relationship: witness.relationship, isSelected: witness.isSelected }) } }, (witness: Witness) => witness.id) } .width('100%') .layoutWeight(1) .cachedCount(10) // 预缓存 10 个列表项 } .width('100%') .height('100%') .backgroundColor(Color.White) } }

三、LazyForEach 数据源

3.1 实现数据源

// 实现 LazyForEach 的数据源 class WitnessDataSource implements IDataSource { private dataArray: Witness[] = []; constructor(data: Witness[]) { this.dataArray = data; } totalCount(): number { return this.dataArray.length; } getData(index: number): Witness { return this.dataArray[index]; } registerDataChangeListener(listener: DataChangeListener): void { // 注册数据变化监听 } unregisterDataChangeListener(listener: DataChangeListener): void { // 取消数据变化监听 } }

3.2 cachedCount 缓存策略

// 缓存策略配置 List() { // 列表项 } .cachedCount(10) // 预缓存 10 个列表项
cachedCount 值效果适用场景
0不缓存列表项很少
5少量缓存中等列表
10标准缓存长列表(推荐)
20大量缓存快速滚动场景

四、多类型列表项

4.1 多类型渲染

// 多类型列表项 List() { // 轮播图类型 ListItem() { Swiper() { // 轮播内容 } } // 普通列表项 ForEach(this.items, (item) => { ListItem() { Text(item.name) } }) }

五、分组吸顶

5.1 ListItemGroup 分组

// 分组列表 List() { ListItemGroup({ header: this.buildGroupHeader('5月') }) { ListItem() { Text('我们结婚了') } ListItem() { Text('第一次旅行') } } ListItemGroup({ header: this.buildGroupHeader('3月') }) { ListItem() { Text('新年愿望') } } } .sticky(StickyStyle.Header) // 分组头吸顶

六、性能优化

6.1 优化策略对比

策略效果实现方式
@Reusable组件复用减少组件创建使用@Reusable装饰器
LazyForEach懒加载只渲染可见项使用IDataSource
cachedCount缓存减少空白期配置缓存数量
固定列表项高度提高滚动性能设置固定高度

6.2 使用建议

  • 列表项超过 20 个时,使用LazyForEach替代ForEach
  • 列表项结构复杂时,使用@Reusable装饰器
  • 设置cachedCount为 5-10,平衡内存和体验
  • 使用ListItemGroup实现分组吸顶效果

十、最佳实践与优化建议

在实际开发中,合理运用上述技术可以显著提升应用的性能和用户体验。以下是几个关键的最佳实践建议:

10.1 性能优化要点

优化方向具体措施预期效果
渲染性能减少不必要的组件重建提升帧率
内存管理及时释放不再使用的资源降低内存占用
响应速度避免在主线程执行耗时操作提升交互流畅度

10.2 推荐实践步骤

按照以下步骤进行优化:

  1. 使用 DevEco Studio 的 Profiler 工具分析当前性能瓶颈
  2. 针对识别出的热点进行针对性优化
  3. 通过单元测试和集成测试验证优化效果
  4. 在真机环境下进行回归测试

10.3 代码示例

// 推荐的最佳实践示例 @Component export struct OptimizedComponent { // 使用 @State 管理最小粒度的状态 @State private isActive: boolean = false; build() { Column() { Text(this.isActive ? '激活' : '未激活') .fontSize(16) } .onClick(() => { // 使用 animateTo 实现平滑过渡 animateTo({ duration: 300 }, () => { this.isActive = !this.isActive; }); }); } }

最佳实践提示:在编写代码时,始终遵循 ArkUI 的性能优化原则,避免在 build() 方法中执行复杂计算或频繁的状态更新。

十、进一步学习与拓展

掌握以上内容后,可以进一步探索以下相关主题,深化对 HarmonyOS 开发的理解:

10.1 推荐学习路径

学习阶段主题预期目标
基础阶段掌握核心概念和 API 用法能够独立完成基本功能开发
进阶阶段理解底层原理和最佳实践能够优化应用性能和用户体验
高级阶段掌握架构设计和性能调优能够主导复杂项目的技术方案

10.2 实践项目建议

建议通过以下实践项目巩固所学知识:

  1. 基于小事记项目,尝试独立实现一个类似的功能模块
  2. 阅读 HarmonyOS 官方 Sample 代码,学习最佳实践
  3. 参与开源社区,贡献代码或文档

10.3 相关资源

  • HarmonyOS 官方文档:提供完整的 API 参考和开发指南
  • DevEco Studio 文档:包含 IDE 使用技巧和调试方法
  • 开源社区:获取项目源码和开发经验

学习建议:理论与实践相结合,在阅读文档的同时动手编写代码,才能更好地掌握 HarmonyOS 应用开发技能。

总结

本文深入解析了 List 组件和 ListItem 复用机制。核心要点如下:

  1. @Reusable 装饰器:通过aboutToReuse重置数据,实现列表项复用
  2. LazyForEach 懒加载:只渲染可见区域,减少内存占用
  3. cachedCount 缓存:预缓存列表项,减少滚动时的空白期
  4. ListItemGroup 分组:支持分组头吸顶效果
  5. 性能优化:组合使用@Reusable+LazyForEach+cachedCount

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


九、完整示例代码

9.1 完整组件实现

以下是一个完整的组件实现示例,展示了本文介绍的各个技术点的综合运用:

import { Component, State, Prop } from '@kit.ArkUI'; @Component export struct DemoComponent { @Prop title: string = ''; @State count: number = 0; build() { Column({ space: 12 }) { // 标题区域 Text(this.title) .fontSize(18) .fontWeight(FontWeight.Bold) .fontColor('#1A1A2E') .width('100%') // 内容区域 Text(`当前计数: ${this.count}`) .fontSize(14) .fontColor('#6B7280') // 交互按钮 Button('点击增加') .width(120) .height(40) .backgroundColor('#7B68EE') .borderRadius(20) .fontColor(Color.White) .onClick(() => { this.count++; }) } .width('100%') .padding(16) .backgroundColor(Color.White) .borderRadius(12) .shadow({ radius: 4, color: '#00000008', offsetX: 0, offsetY: 2 }) } }

9.2 使用方式

在页面中引入并使用该组件:

@Entry @Component struct Index { build() { Column() { DemoComponent({ title: '示例组件' }) } .width('100%') .height('100%') .backgroundColor('#F8F9FA') } }

9.3 代码说明

  • 组件封装:使用@Component装饰器定义可复用的组件
  • 状态管理:使用@State管理组件内部状态
  • 参数传递:使用@Prop接收外部传入的参数
  • 事件处理:使用onClick处理用户交互
  • 样式优化:使用borderRadiusshadow等属性美化 UI

相关资源:

  • 官方文档 - 开发者指南:HarmonyOS 应用开发
  • 官方文档 - ArkUI 组件参考:ArkUI 组件
  • 官方文档 - API 参考:API 参考
  • 官方文档 - 状态管理:状态管理概述
  • 官方文档 - 动画:动画概述
  • 官方文档 - 网络管理:网络管理
  • 官方文档 - 数据管理:数据管理
  • 开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询