更新记录
0.1.13(2026-08-18)
下载此版本
- 修复 scroll-view 标签属性区条件编译注释被解析为属性的隐患:
@scrollend(仅鸿蒙/iOS)改为条件编译双分支渲染(注释移至标签外)
0.1.10(2026-08-14)
下载此版本
- 精简 readme:移除内部开发向内容(设计说明 / 实现细节 / 平台差异实现等),只保留安装、用法、API、主题等用户文档
0.1.8(2026-08-07)
下载此版本
- 修复 iOS 端滑动掉帧:
onScroll 从每个 scroll 事件同步更新窗口改为 32ms 合并 + scrollend 强制同步(APP-IOS 复用鸿蒙机制,scroll/visible-change 在 scrollend 同步触发),并在窗口中部滚动时跳过重建
- 修复 iOS 端快速滑动下方空白:缓冲行数下限抬到 12(
APP-IOS),scrollend 用最新 scrollTop 强制对齐窗口
- Android、Web 和小程序行为保持不变
查看更多
平台兼容性
uni-app x(4.25)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| √ |
√ |
√ |
√ |
√ |
√ |
其他
nax-virtual-list
固定行高虚拟列表。使用 scroll-view + 上下 spacer,只渲染可视区与缓冲行,适合一次性持有大量数据。
与 nax-list 的区别:nax-list 是滚动壳(内容自行 v-for,不裁剪 DOM);本组件接管数据源并做窗口裁剪。
能力
- 固定
itemHeight:全端窗口裁剪
- 作用域插槽自定义行:
{ item, index }
- 触底
load、下拉刷新、空 / 加载 / 结束 / 错误态(对齐 nax-list)
- 方法:
scrollToIndex / scrollToOffset / getVisibleRange
用法
基础(大数据)
<nax-virtual-list
height="480px"
:list="list"
:item-height="56"
:buffer="8"
key-field="id"
>
<template #default="{ item, index }">
<nax-cell :title="item.title" :value="'' + (index + 1)" is-link></nax-cell>
</template>
</nax-virtual-list>
const list = ref([] as UTSJSONObject[])
// 一次性生成 / 从本地读入大量数据
触底加载更多
<nax-virtual-list
height="480px"
:list="list"
:item-height="48"
:loading="loading"
:finished="finished"
@load="onLoad"
>
<template #default="{ item, index }">
<nax-cell :title="item.title"></nax-cell>
</template>
</nax-virtual-list>
滚动到指定行
// 模板 ref
const vlRef = ref(null)
// 调用
// vlRef.value!.scrollToIndex(500)
Props
| 属性 |
类型 |
默认 |
说明 |
| list |
array |
[] |
完整数据源 |
| item-height |
number |
48 |
行高 px(固定等高) |
| buffer |
number |
6 |
上下缓冲行;鸿蒙不足 12 时抬到 12 |
| key-field |
string |
'' |
数据项业务 id(行 DOM 使用窗口位置 key) |
| height |
string |
'' |
滚动区高度;空则 flex:1 |
| show-scrollbar |
boolean |
true |
滚动条 |
| nested-scroll |
boolean |
false |
Android 端嵌套滚动:VDOM 外层需启用 type="nested" 并包裹 nested-scroll-body;蒸汽模式只需此属性;其它端无影响 |
| loading / finished / error / empty |
boolean |
false |
底栏 / 空态(受控) |
| disabled |
boolean |
false |
禁用触底 load |
| offset |
number |
80 |
触底阈值 px |
| enable-refresh |
boolean |
false |
下拉刷新 |
| refreshing |
boolean |
false |
刷新中(受控) |
| loading-text / finished-text / error-text / empty-text / empty-icon |
string |
中文默认 |
文案 |
| custom-class |
string |
'' |
根 class |
| item-class |
string |
'' |
行容器 class |
Events
| 事件 |
说明 |
| load |
触底需要加载更多 |
| refresh |
下拉刷新 |
| update:refreshing |
刷新态同步 |
| click-error |
点击错误区(随后仍发 load) |
| click |
点击行 { index, item } |
| visible-change |
可视窗口 { start, end }(半开区间 end) |
| scroll |
滚动 { scrollTop, start, end } |
Methods
| 方法 |
说明 |
| scrollToIndex(index, animated?) |
滚到索引(尽量置顶) |
| scrollToOffset(offsetY, animated?) |
滚到 px 偏移 |
| getVisibleRange() |
{ start, end, scrollTop } |
| tryLoad() |
canLoad 时发 load |
Slots
| 名称 |
说明 |
| default |
作用域 { item, index };未传时用 title/label/name/text 或 #index 兜底 |
| header / footer |
顶 / 底 |
| empty / loading / finished / error |
状态覆盖 |
主题
通过 CSS 变量覆盖:
| Token |
用途 |
--nax-color-bg |
背景色 |
--nax-color-divider |
分割线色 |
--nax-color-error |
错误色 |
--nax-color-text |
主文字色 |
--nax-color-text-secondary |
次要文字色 |
依赖
nax-empty
nax-loading
nax-ui-theme(可选 token)
注意
- 必须等高:每行实际高度应等于
item-height,否则滚动定位会漂。
- 必须有明确高度:
height 或父级 flex 高度链。
- 作用域插槽在部分端对类型较严,建议用
UTSJSONObject 取字段。
- 不做瀑布流 / 不等高测量。