查看: 209|回复: 3

鸿蒙uni-app x长列表list-view下拉刷新与嵌套滚动

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
长列表在聊天记录、商品列表、新闻Feed和评论列表里很常见。数据量上来后,普通scroll-view的渲染资源会持续累积,列表越滑越卡。鸿蒙平台从4.61开始支持uni-app x的list-view组件,它基于recycle-view回收视图,只渲染屏幕可见区域的列表项,滑出屏幕的项会被回收复用。按原文给出的判断,1000条数据和10条数据的渲染开销差不多。选型上可以记住一条:长列表用list-view,内容不多的滚动场景继续用scroll-view。

一、核心能力与组件结构
list-view负责长列表容器,list-item表示列表项。原文列出的能力包括下拉刷新、嵌套滚动、滚动位置控制、滚动事件和吸顶分组。开发中常用到这些属性:refresher-enabled、refresher-triggered、refresher-default-style、scroll-into-view、scroll-with-animation、lower-threshold、associative-container;常用事件包括refresherrefresh、scrolltolower、scroll、refresherpulling、refresherrestore、refresherabort。吸顶分组使用sticky-header包住分组标题。这些属性和事件在基础列表、刷新加载、定位和嵌套滚动里组合使用。

二、基础长列表
最小写法是list-view包list-item,用v-for生成数据,key绑定索引。原文示例:
  1. <template>
  2. <list-view style="flex: 1;">
  3. <list-item v-for="(item, index) in dataList" :key="index"
  4. style="padding: 15px; border-bottom: 1px solid #eee;">
  5. <text style="font-size: 16px;">{{item}}</text>
  6. </list-item>
  7. </list-view>
  8. </template>
复制代码

三、下拉刷新与上拉加载
最常见的交互组合是下拉刷新加scrolltolower上拉加载。原文示例用isRefreshing控制刷新态,loadingText显示加载文案,page记录页码。onRefresh中把isRefreshing置为true、page重置为1、loadingText恢复为“加载更多...”,setTimeout后重新loadList并复位刷新态;loadMore先判断loadingText是否为“没有更多了”,再置为“加载中...”,追加数据、page自增,原文示例在page>=5时显示“没有更多了”,综合示例中则在page>=4时结束加载。调试时要重点确认刷新态是否复位、loadingText是否卡在加载中。

四、吸顶分组
分组列表用groupList保存title和items。sticky-header包住分组标题,list-item遍历group.items,key用gIndex加“-”加index,避免分组内索引冲突。

五、自定义下拉刷新
自定义样式需要设置refresher-default-style="none",并用slot="refresher"挂自定义刷新元素。原文通过refresherpulling的event.detail.dy判断,dy>45时显示“释放立即刷新”,否则显示“下拉刷新”;onRefresh显示“正在刷新...”,onRestore和onAbort恢复文案。鸿蒙平台要注意:自定义下拉刷新元素不能放在list-view的首个子元素位置,否则可能无法正常显示。原文给出的结构是先放内容,再把自定义刷新元素放最后:
  1. <list-view refresher-default-style="none" :refresher-enabled="true">
  2. <!-- 先放内容 -->
  3. <list-item v-for="i in 20">...</list-item>
  4. <!-- 自定义刷新元素放在最后 -->
  5. <list-item slot="refresher">
  6. <text>下拉刷新</text>
  7. </list-item>
  8. </list-view>
复制代码

六、滚动定位与聊天列表
scroll-into-view绑定目标id,scroll-with-animation="true"让滚动带动画。聊天消息列表用scroll-into-view定位到'msg-'+latestId,让新消息显示在底部;底部再放一个id为'msg-'+latestId、height:1px的list-item占位;refresherrefresh触发loadHistory加载历史消息。原文模拟消息示例中latestId自增并push消息,形成倒序列表效果。

七、嵌套滚动
外层scroll-view设置type="nested",nested-scroll-header放头部,nested-scroll-body放list-view,并设置associative-container="nested-scroll-view"。list-view上可以继续挂refresher-enabled和refresherrefresh。原文示例中头部区域高度200px,刷新后1.5秒复位。

八、综合页面与调试要点
综合示例包含标签栏、吸顶统计、下拉刷新、上拉加载和scroll事件。list-view设置lower-threshold="100",scrolltolower触发loadMore,scroll事件把event.detail.scrollTop取整显示为px;吸顶统计展示list.length和scrollPos。切换tab时重置page为1、loadingText并重新loadList。调试时重点看刷新状态是否复位、loadingText是否卡住、scroll-into-view的id是否与list-item一致、嵌套滚动容器名是否匹配。

九、鸿蒙平台适配与原生对比
HarmonyOS 4.61版本开始支持list-view组件。自定义下拉刷新元素位置限制和嵌套滚动配置是鸿蒙平台需要特别注意的点。原文对比了鸿蒙原生List组件:原生写法用List+ForEach+ListItem,设置listDirection(Axis.Vertical)和edgeEffect(EdgeEffect.Spring)。uni-app x的list-view跟原生List几乎一样,都是基于回收复用机制;但list-view的下拉刷新、吸顶效果这些功能,原生List都得自己实现。从开发效率看,list-view把长列表常用交互封装得更完整;从选型看,普通短内容滚动仍用scroll-view,长列表和需要刷新、吸顶、嵌套滚动组合时优先评估list-view。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: 鸿蒙uni-app x长列表list-view下拉刷新与嵌套滚动

这篇整理得很实用,把 list-view 的选型和常见组合场景基本都覆盖到了。我之前一直用 scroll-view 堆长列表,数据一多就明显发涩,看完更理解 recycle-view 回收复用这个思路了,回头准备把商品列表和评论列表先迁过去试试。 几个点印象比较深:一是下拉刷新和 scrolltolower 组合时,刷新态复位和 loadingText 状态最容易出问题,尤其是“没有更多了”和“加载中...”互相覆盖的情况,调试时确实得盯着这两个状态;二是自定义刷新元素在鸿蒙上不能放首个子元素这个坑,原文给的结构是先内容后刷新元素,挺有参考价值;三是聊天列表用 scroll-into-view 加底部 1px 占位项的思路很巧,比手动算滚动高度省事。 想再请教一下,嵌套滚动里 associative-container 和外层 scroll-view 的 type="nested" 必须成对配置吗,如果外层不是 scroll-view 而是别的容器还能不能生效?另外吸顶分组里的 key 用分组索引加项索引拼接,这个在分组数据动态增删时会不会有复用错位的问题,有没有更稳妥的写法?
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: 鸿蒙uni-app x长列表list-view下拉刷新与嵌套滚动

看完收获很大,尤其是长列表选型和几个容易踩坑的点总结得很清楚。list-view 基于回收视图,1000 条和 10 条渲染开销差不多这个判断很直观;下拉刷新状态复位、loadingText 不要卡在“加载中”、scroll-into-view 的 id 要和 list-item 对得上,这些调试要点也很实用。自定义下拉刷新元素不能放在 list-view 首个子元素位置、要放到最后这一点,之前很容易忽略;嵌套滚动里外层 scroll-view 的 type 和 associative-container 配置也记下了。最后鸿蒙原生 List 组件的对比部分好像没贴完,方便的话想继续看看这部分,特别是和 list-view 在回收机制、下拉刷新、嵌套滚动上的差异。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: 鸿蒙uni-app x长列表list-view下拉刷新与嵌套滚动

感谢分享,内容挺全的,尤其是自定义下拉刷新元素不能放首个子元素这个坑,还有嵌套滚动的容器名匹配,之前确实容易踩。想请教几个实践中会碰到的细节: 一是基础长列表里 key 绑索引,数据有增删或排序时会不会导致复用错位?比如上拉加载追加还好,但下拉刷新重置page=1、整体替换数据时,索引key会不会让某些列表项状态串了?你们实际项目里是用索引还是用业务id? 二是 loadingText 既当状态又当文案,调试时确实容易卡在"加载中..."。如果接口失败或者没有更多数据,楼主一般怎么兜底复位?是加 finally 还是用单独的 isLoading 布尔量更稳? 三是 scroll-into-view 聊天列表那个占位 list-item 高度1px,新消息来了 latestId 自增,定位会不会有抖动或者动画没走完就又被下一次更新打断?有没有加节流或者只在特定条件下滚动到底? 四是原文最后对比鸿蒙原生 List 组件那部分好像没贴完,方便补一下吗?想看看在回收机制、下拉刷新和嵌套滚动上和 list-view 的实际差异,选型时好有个参照。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-10-30 07:55 , Processed in 0.033102 second(s), 28 queries , Gzip On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部