news 2026/5/16 7:46:00

二十六、【鸿蒙 NEXT】LazyForeach没有刷新

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二十六、【鸿蒙 NEXT】LazyForeach没有刷新

【前言】

上一章我们介绍了@ObservedV2与LazyForeach结合实现动态刷新的效果,这里在上一章代码基础上给出一种场景,虽然LazyForeach中的generateKey变更了,但是列表还是没有刷新的情况。

1、结合Refresh组件实现下拉刷新

我们在展示列表数据时,经常会用到下拉列表刷新的功能,鸿蒙中对应的组件Refresh组件,代码如下:

2、从云测获取数据,并更新页面的状态列表数据

我们数据大多数情况都是从云测获取,而云测定义的一些id,一般都是Long类型,而鸿蒙中的number类型数据长度有限,如果数据过长,可能在将云测数据转为本地数据时,造成id被截断,因此我们经常会用@ohmos/json-bigint组件实现json转换,代码实现如下:

我们假设jsonStr是从云测请求到的数据,且其中的id是19位,因此我们做json转换需要用到json-bigint组件转换,且Message对象中的id定义为string类型,防止number类型接收被截断。注意这里我们json转换完成后,直接通过as转为了Message数据对象,并赋值给了LayForeach的dataSource实现列表的加载

aboutToAppear(): void { let jsonStr = '[{"id":1231231231231231246,"name":"张三","icon":""},{"id":1231231231231231247,"name":"张四","icon":""},{"id":1231231231231231248,"name":"张五","icon":""}]' this.dataSource.addItems(JsonBigInt.parse(jsonStr) as Message[]) } @ObservedV2 class Message { id:string = '' @Trace name:string = '' icon:ResourceStr = '' }

3、下拉刷新实现

如下,我们在Refresh组件的onRefreshing属性中实现下拉刷新的操作,模拟从云测获取json数据,并转换为本地对象数组,重新赋值给lazyForeach组件的dataSource实现列表刷新:

我们可以看到,我们lazyForeach中的generateKey用的是Message的id字段,我们这里打印了id,在刷新逻辑中,我们新增了一个id的数据,并删除了最后一个数据,与aboutAppear中的数据对比,前后两个数据的id肯定是变了。那么我们下拉看下效果

Refresh({refreshing:this.refreshing}){ List({space:10}) { LazyForEach(this.dataSource, (item:Message)=> { ListItem() { Row(){ Image(item.icon || $r('app.media.touxiang1')).height(40).width(40) Text(item.name) } } }, (item:Message) => { console.log(`current id = ${item.id}`) return item.id }) } }.onRefreshing(() => { this.refreshing = true setTimeout(() => { this.refreshing = false let jsonStr = '[{"id":1231231231231231241,"name":"张六","icon":""},{"id":1231231231231231246,"name":"张三","icon":""},{"id":1231231231231231247,"name":"张四","icon":""}]' this.dataSource.refreshItems(JsonBigInt.parse(jsonStr) as Message[]) },2000) })

效果如下:

我们看下generateKey的打印,明显前后的id变了,但是为啥列表没刷新?

4、原因分析

(1)由于我们直接通过as转换类型,实际上即使我们Message中的id定义为string类型,实际还是bigInt数据

(2)LazyForeach组件在刷新前,会对generateKey的返回值类型做判断,如果不是string类型,就直接报错,不会刷新列表,这里和Foreach组件不同,Foreach组件不会做类型判断

5、解决方式

解决方案也很简单,就是将generateKey中的item.id改为item.id.toString()

效果如下:

完整的示例代码如下:DateSource代码参考上一章

import JsonBigInt from '@ohmos/json-bigint' import { DateSource } from './DateSource' @Entry @ComponentV2 struct LazyForeachPage { @Local refreshing:boolean = false dataSource: DateSource<Message> = new DateSource() private index = 1 aboutToAppear(): void { let jsonStr = '[{"id":1231231231231231246,"name":"张三","icon":""},{"id":1231231231231231247,"name":"张四","icon":""},{"id":1231231231231231248,"name":"张五","icon":""}]' this.dataSource.addItems(JsonBigInt.parse(jsonStr) as Message[]) } build() { Column(){ Button('ObservedV2刷新').onClick(() => { this.index++ this.dataSource.getAllData().find(item => item.id === '3')!.name = `张${this.index}` }) Button('原始刷新').onClick(() => { this.index++ this.dataSource.changeData(2,{id:'3', name: `张${this.index}`, icon:$r('app.media.touxiang1')} as Message) }) Refresh({refreshing:this.refreshing}){ List({space:10}) { LazyForEach(this.dataSource, (item:Message)=> { ListItem() { Row(){ Image(item.icon || $r('app.media.touxiang1')).height(40).width(40) Text(item.name) } } }, (item:Message) => { console.log(`current id = ${item.id}`) return item.id.toString() }) } }.onRefreshing(() => { this.refreshing = true setTimeout(() => { this.refreshing = false let jsonStr = '[{"id":1231231231231231241,"name":"张六","icon":""},{"id":1231231231231231246,"name":"张三","icon":""},{"id":1231231231231231247,"name":"张四","icon":""}]' this.dataSource.refreshItems(JsonBigInt.parse(jsonStr) as Message[]) },2000) }) } .padding({left:32}) .height('100%') .width('100%') } } @ObservedV2 class Message { id:string = '' @Trace name:string = '' icon:ResourceStr = '' }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 4:09:49

VibeVoice网页UI体验:操作直观,预览流畅

VibeVoice网页UI体验&#xff1a;操作直观&#xff0c;预览流畅 1. 引言&#xff1a;对话式语音合成的新范式 在内容创作日益依赖自动化工具的今天&#xff0c;文本转语音&#xff08;TTS&#xff09;技术已不再满足于简单的“朗读”功能。播客、有声书、虚拟访谈等场景对多角…

作者头像 李华
网站建设 2026/5/11 4:21:34

Hunyuan-MT-7B-WEBUI实战教程:WMT25冠军模型部署全记录

Hunyuan-MT-7B-WEBUI实战教程&#xff1a;WMT25冠军模型部署全记录 1. 引言 1.1 学习目标 本文旨在为开发者和研究人员提供一份完整的 Hunyuan-MT-7B-WEBUI 模型部署指南。通过本教程&#xff0c;您将掌握&#xff1a; 如何快速部署腾讯混元开源的最强翻译模型在本地或云端…

作者头像 李华
网站建设 2026/5/11 4:21:32

Qwen3-VL-WEB备份恢复:模型状态持久化存储策略

Qwen3-VL-WEB备份恢复&#xff1a;模型状态持久化存储策略 1. 引言 1.1 业务场景描述 在基于Qwen3-VL-WEB的多模态推理应用中&#xff0c;用户常需在不同会话间保持模型上下文连续性。例如&#xff0c;在网页端进行长时间视觉代理任务&#xff08;如自动化GUI操作&#xff0…

作者头像 李华
网站建设 2026/5/15 4:47:27

视觉模型新选择:Qwen3-VL实测对比,云端测试更省心

视觉模型新选择&#xff1a;Qwen3-VL实测对比&#xff0c;云端测试更省心 你有没有遇到过这样的情况&#xff1a;项目需要识别发票、分析图表、理解产品图片&#xff0c;但手头的模型要么效果差&#xff0c;要么部署复杂&#xff0c;维护起来像“修车”一样频繁&#xff1f;作…

作者头像 李华
网站建设 2026/5/15 18:23:46

unet人像卡通化历史记录功能:即将上线亮点解析

unet人像卡通化历史记录功能&#xff1a;即将上线亮点解析 1. 功能概述 本工具基于阿里达摩院 ModelScope 的 DCT-Net 模型&#xff0c;构建于 UNet 架构之上&#xff0c;实现高效的人像到卡通风格的转换。项目由“科哥”主导开发&#xff0c;命名为 unet person image carto…

作者头像 李华
网站建设 2026/5/5 19:52:54

2026-01-16 全国各地响应最快的 BT Tracker 服务器(移动版)

数据来源&#xff1a;https://bt.me88.top 序号Tracker 服务器地域网络响应(毫秒)1http://211.75.210.221:6969/announce广东佛山移动372udp://45.9.60.30:6969/announce北京移动1193udp://107.189.7.165:6969/announce北京移动1234udp://84.54.51.78:6969/announce北京移动12…

作者头像 李华