Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >06 HarmonyOS Next性能优化之LazyForEach 列表渲染基础与实现详解 (一)

06 HarmonyOS Next性能优化之LazyForEach 列表渲染基础与实现详解 (一)

原创
作者头像
全栈若城
修改于 2025-03-07 13:25:15
修改于 2025-03-07 13:25:15
1280
举报

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦!

一、代码结构概览

本文将详细解析一个基于 HarmonyOS Next API 12 实现的高性能列表渲染示例。该示例展示了如何通过合理的代码组织和多种优化技巧来提升列表性能。主要包含以下几个核心部分:

  1. 数据源管理(ArrayDataSource 类)
  2. 数据结构定义(ItemData 接口)
  3. 优化的列表项组件(OptimizedListItem)
  4. 主列表组件(ListDemo)

案例运行效果如下

二、详细代码解析

1. 数据源管理实现

代码语言:typescript
AI代码解释
复制
class ArrayDataSource implements IDataSource {
    private dataArray: ItemData[];

    constructor(data: ItemData[]) {
        this.dataArray = data;
    }

    totalCount(): number {
        return this.dataArray.length;
    }

    getData(index: number): ItemData {
        return this.dataArray[index];
    }

    registerDataChangeListener(listener: DataChangeListener): void {
        // 简单实现可暂不处理
    }

    unregisterDataChangeListener(listener: DataChangeListener): void {
        // 简单实现可暂不处理
    }
}

性能优化要点:

  1. 数据源封装
    • 实现 IDataSource 接口,提供标准化的数据访问方式
    • 通过 getData 方法实现数据的按需加载,避免一次性加载全部数据
    • totalCount 方法提供数据总量信息,便于 LazyForEach 进行渲染优化
  2. 数据变更监听机制
    • 提供数据变更监听接口,支持数据动态更新
    • 可以根据实际需求实现更复杂的数据变更处理逻辑

2. 数据结构定义

代码语言:typescript
AI代码解释
复制
interface ItemData {
    id: number
    title: string
    description: string
    avatar: string
    type: 'simple' | 'badge'
    unreadCount?: number
}

优化考虑:

  1. 类型安全
    • 使用 TypeScript 接口定义数据结构,提供类型检查
    • 通过可选属性(unreadCount?)优化内存占用
  2. 数据结构设计
    • 使用 type 字段区分不同类型的列表项,支持条件渲染
    • 合理组织数据字段,避免冗余信息

3. 优化的列表项组件

代码语言:typescript
AI代码解释
复制
@Component
struct OptimizedListItem {
    @Prop item: ItemData

    @Builder
    ItemContent() {
        Row() {
            Image(this.item.avatar)
                .width(40)
                .height(40)
                .margin({ right: 10 })

            Column() {
                Text(this.item.title)
                    .fontSize(16)
                    .fontWeight(FontWeight.Medium)

                Text(this.item.description)
                    .fontSize(14)
                    .opacity(0.6)
            }
            .alignItems(HorizontalAlign.Start)
        }
        .width('100%')
        .padding(10)
        .backgroundColor('#F5F5F5')
        .border({
            width: 1,
            color: '#E0E0E0',
            style: BorderStyle.Solid
        })
    }

    build() {
        if (this.item.type === 'simple') {
            this.ItemContent()
        } else {
            Stack() {
                this.ItemContent()

                Badge({
                    value: this.item.unreadCount+'',
                    position: BadgePosition.RightTop,
                    style: { badgeSize: 16, badgeColor: '#FA2A2D' }
                }) {
                    Text('').width(40).height(40)
                }
            }
        }
    }
}

性能优化策略:

  1. 组件复用
    • 使用 @Builder 装饰器定义可复用的 ItemContent 子组件
    • 避免重复创建相同的 UI 结构,减少内存占用
  2. 条件渲染
    • 根据 item.type 进行条件渲染,只渲染必要的 UI 元素
    • 简单类型直接渲染 ItemContent,复杂类型添加 Badge 组件
  3. 属性传递优化
    • 使用 @Prop 装饰器接收数据,避免数据重复
    • 通过单一数据对象传递,减少属性传递开销
  4. 布局优化
    • 使用 Row 和 Column 组件实现高效的弹性布局
    • 通过 Stack 组件实现 Badge 的叠加效果,避免复杂的定位计算

4. 主列表组件实现

代码语言:typescript
AI代码解释
复制
@Entry
@Component
struct ListDemo {
    @State dataList: ItemData[] = [
        {
            id: 1,
            title: '消息通知',
            description: '您有一条新的系统通知',
            avatar: '/assets/userPhone.JPG',
            type: 'badge',
            unreadCount: 3
        },
        {
            id: 2,
            title: '系统更新',
            description: '系统有新版本可用',
            avatar: '/assets/userPhone.JPG',
            type: 'simple'
        }
    ]

    build() {
        List() {
            LazyForEach(new ArrayDataSource(this.dataList), (item: ItemData) => {
                ListItem() {
                    OptimizedListItem({ item: item })
                }
                .onClick(() => {
                    console.info(`Clicked item: ${item.title}`)
                })
            }, (item: ItemData) => item.id.toString())
        }
        .width('100%')
        .height('100%')
    }
}

核心优化策略:

  1. LazyForEach 懒加载
    • 使用 LazyForEach 替代普通的 ForEach,实现列表项的按需渲染
    • 配合 ArrayDataSource 实现高效的数据管理
  2. 状态管理
    • 使用 @State 装饰器管理列表数据,支持响应式更新
    • 数据变更时只更新必要的 UI 部分
  3. 唯一键优化
    • 为每个列表项提供唯一的 key(item.id.toString())
    • 帮助框架更好地进行 DOM diff 和更新优化
  4. 事件处理
    • 在 ListItem 级别处理点击事件,避免事件冒泡
    • 通过闭包保存当前项的数据,无需额外的数据查找

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
鸿蒙(HarmonyOS)性能优化实战-Grid高性能开发
在构建大型、复杂应用时,性能优化至关重要。Grid布局作为一种高效布局方式,可以提高页面的均分能力、子组件占比控制能力及自适应布局能力。本文将介绍Grid在高性能开发方面的应用,包括懒加载、cachedCount、组件复用和使用GridLayoutOptions设置GridItem大小等方法,帮助开发者优化Grid布局性能,减少加载和渲染时间,提升用户体验。
小帅聊鸿蒙
2024/10/18
2240
鸿蒙(HarmonyOS)性能优化实战-Grid高性能开发
【HarmonyOS之旅】ArkTS语法(三) -> 渲染控制
ArkTS也提供了渲染控制的能力。条件渲染可根据应用的不同状态,渲染对应状态下的UI内容。循环渲染可从数据源中迭代获取数据,并在每次迭代过程中创建相应的组件。
枫叶丹
2025/01/02
1450
【HarmonyOS之旅】ArkTS语法(三) -> 渲染控制
18 HarmonyOS NEXT UVList组件开发指南(五)
在开发UVList组件的过程中,我们遵循了以下设计原则,这些原则也适用于其他组件的开发:
全栈若城
2025/03/10
1070
101.HarmonyOS NEXT跑马灯组件教程:数据源与数据类型详解
在HarmonyOS NEXT跑马灯组件的实现中,数据模型是组件正常工作的基础。本文将详细介绍跑马灯组件使用的数据源和数据类型,包括TripDataType接口、TripDataSource类和相关的数据处理机制。
全栈若城
2025/03/17
850
鸿蒙(HarmonyOS)应用开发之性能优化实战-组件复用
若开发者的应用中存在以下场景,并成为UI线程的帧率瓶颈,应该考虑使用组件复用机制提升应用性能:
小帅聊鸿蒙
2024/10/16
3620
鸿蒙(HarmonyOS)应用开发之性能优化实战-组件复用
HarmonyOS 应用列表场景性能提升实践
在应用的UI开发中,使用列表是一种常规场景,因此,对列表性能进行优化是非常重要的。本文将针对应用开发列表场景的性能提升实践方法展开介绍。
小帅聊鸿蒙
2024/10/14
2420
HarmonyOS 应用列表场景性能提升实践
鸿蒙(HarmonyOS)性能优化实战-减少首帧绘制时的冗余操作
应用冷启动即当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用。
小帅聊鸿蒙
2024/10/23
1520
鸿蒙(HarmonyOS)性能优化实战-减少首帧绘制时的冗余操作
ArkTS语言的LazyForEach懒加载循环
前面我发了一篇渲染控制的文章里面有 if/else 和 foreach 的知识点,本次的 LazyForEach 也是属于渲染控制的在官方文档也可以看到归类,那么他的作用是,LazyForEach从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。
杨不易呀
2023/12/09
7150
ArkTS语言的LazyForEach懒加载循环
【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发四
在pages目录下创建一个Web组件。在Web组件中通过src指定引用的网页路径,controller为组件的控制器,通过controller绑定Web组件,用于调用Web组件的方法。
枫叶丹
2025/01/23
1060
HarmonyOS APP性能优化之提升应用响应速度
应用对用户的输入需要快速反馈,以提升交互体验,因此本文提供了以下方法来提升应用响应速度。
小帅聊鸿蒙
2024/10/14
1740
HarmonyOS APP性能优化之提升应用响应速度
鸿蒙(HarmonyOS)性能优化实战-Swiper高性能开发
在应用开发中,Swiper 组件常用于翻页场景,比如:桌面、图库等应用。Swiper 组件滑动切换页面时,基于按需加载原则通常会在下一个页面将要显示时才对该页面进行加载和布局绘制,这个过程包括:
小帅聊鸿蒙
2024/10/17
2180
鸿蒙(HarmonyOS)性能优化实战-Swiper高性能开发
HarmonyOS4.0——ArkUI应用说明
ArkUI开发框架是方舟开发框架的简称,它是一套构建 HarmonyOS / OpenHarmony 应用界面的声明式UI开发框架,它使用极简的UI信息语法、丰富的UI组件以及实时界面语言工具,帮助开发者提升应用界面开发效率 30%,开发者只需要使用一套 TS / JS API,就能在多个 HarmonyOS / OpenHarmony 设备上提供既丰富又流畅的用户界面体验。
小帅聊鸿蒙
2024/07/04
3980
HarmonyOS4.0——ArkUI应用说明
鸿蒙应用开发-自定义可删除列表弹窗
自定义列表弹窗,可以对弹窗的列表点击删除,参考文档创建列表,自定义弹窗文档自定义弹窗(CustomDialog)。
夜雨飘零
2024/05/26
1750
鸿蒙应用开发-自定义可删除列表弹窗
78. Harmonyos NEXT 懒加载数据源实现解析:BasicDataSource与CommonLazyDataSourceModel详解
完整构建了HarmonyOS应用的高效数据加载体系,适用于相册、商品列表、聊天记录等需要处理大量数据的场景。
全栈若城
2025/03/15
760
纯血鸿蒙APP实战开发——主页瀑布流实现
本示例介绍使用ArkUI WaterFlow 组件和 LazyForEach 实现瀑布流场景。该场景多用于购物、资讯类应用。
小帅聊鸿蒙
2024/12/23
1410
67.Harmonyos NEXT 图片预览组件之性能优化策略
图片预览组件在处理大量高清图片时,性能优化显得尤为重要。本文将详细介绍图片预览组件中采用的性能优化策略,包括懒加载实现、内存管理、渲染优化等方面,帮助开发者构建高性能的图片预览功能。
全栈若城
2025/03/14
910
53. HarmonyOS NEXT 登录模块开发教程(七):性能优化与最佳实践
在前六篇教程中,我们介绍了HarmonyOS NEXT登录模块的整体架构、模态窗口的实现原理、一键登录页面的实现、短信验证码登录的实现、状态管理和数据绑定机制、安全性考虑以及UI设计和用户体验优化。本篇教程将深入讲解登录模块的性能优化和最佳实践,帮助开发者构建高效流畅的登录功能。
全栈若城
2025/03/13
1060
鸿蒙(HarmonyOS)应用性能优化实战-组件复用四板斧
在滑动场景下,常常会对同一类自定义组件的实例进行频繁的创建与销毁。此时可以考虑通过组件复用减少频繁创建与销毁的能耗。组件复用时,可能存在许多影响组件复用效率的操作,本篇文章将重点介绍如何通过组件复用四板斧提升复用性能。
小帅聊鸿蒙
2024/10/16
2100
鸿蒙(HarmonyOS)应用性能优化实战-组件复用四板斧
鸿蒙开发:一个轻盈的上拉下拉刷新组件
老早之前开源了一个刷新组件,提供了很多常见的功能,也封装了List,Grid,WaterFlow,虽然功能多,但也冗余比较多,随着时间的前去,暴露的问题就慢慢增多,虽然我也提供了通用的RefrshLayout,奈何很多人仍然有许多问题,但大部分都是相关属性以及用法的问题,对于我来说也比较苦恼,既然如此,那就只封装一个刷新加载,其它的自己实现好了,于是针对refresh的轻盈组件就剥离出来了。
程序员一鸣
2024/12/26
1500
鸿蒙开发:一个轻盈的上拉下拉刷新组件
112.HarmonyOS NEXT 跑马灯组件数据源详解:数据管理与监听机制
全栈若城
2025/03/17
820
推荐阅读
相关推荐
鸿蒙(HarmonyOS)性能优化实战-Grid高性能开发
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档