更新记录
1.0.0(2025-10-29) 下载此版本
Features
- 支持下拉刷新和上拉加载
- 自定义下拉刷新器,内置美观的 loading 动画
- 支持自定义刷新器插槽
- 支持虚拟滚动,处理大数据量场景
- 支持瀑布流布局
- 内置骨架屏,优化首屏体验
- 提供空态和错误态组件
- 数据完全由外部控制,灵活易用
- 全平台兼容(H5/App/小程序)
Performance
- 优化瀑布流布局算法,时间复杂度从 O(n×m) 降低到 O(n),大幅提升性能
- 优化虚拟滚动计算,缓存 itemHeight 避免重复计算
- 优化 visibleItems 计算,减少对象展开和内存分配
- 添加滚动事件节流(16ms),优化滚动性能
- 优化 list watcher,避免不必要的瀑布流重新计算
- 为骨架屏动画添加 will-change 提示,优化动画性能
- 添加 beforeDestroy 钩子清理定时器,防止内存泄漏
平台兼容性
uni-app(3.6.12)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 | 
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ | 
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 快应用-华为 | 快应用-联盟 | 
|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | 
neo-zlist-pro
高性能长列表组件,支持下拉刷新、上拉加载、虚拟滚动、瀑布流布局等功能。
特性
- 下拉刷新 + 上拉加载
- 虚拟滚动(处理大数据量)
- 瀑布流布局
- 内置骨架屏
- 空态和错误态管理
- 数据完全由外部控制
- 样式灵活可定制
- 全平台兼容
兼容性
| Vue2 | Vue3 | H5 | App | 微信小程序 | 支付宝小程序 | 百度小程序 | 字节小程序 | QQ小程序 | 
|---|---|---|---|---|---|---|---|---|
| ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 
安装
在 HBuilderX 中右键 uni_modules 目录,选择 从插件市场导入,搜索 neo-zlist-pro 安装。
或者直接复制 neo-zlist-pro 目录到项目的 uni_modules 目录下。
快速开始
基础用法
<template>
  <neo-zlist-pro
    :list="list"
    :loading="loading"
    :finished="finished"
    @refresh="handleRefresh"
    @load-more="handleLoadMore"
  >
    <template #default="{ item }">
      <view class="item">{{ item.title }}</view>
    </template>
  </neo-zlist-pro>
</template>
<script>
export default {
  data() {
    return {
      list: [],
      loading: false,
      finished: false,
      page: 1
    }
  },
  mounted() {
    this.loadData()
  },
  methods: {
    async loadData(isRefresh = false) {
      if (isRefresh) {
        this.page = 1
        this.list = []
        this.finished = false
      }
      this.loading = true
      try {
        const res = await api.getList({ page: this.page, size: 20 })
        this.list = isRefresh ? res.data : [...this.list, ...res.data]
        this.page++
        // 判断是否已加载全部数据(在 page++ 之后)
        if (this.list.length >= res.total) {
          this.finished = true
        }
      } finally {
        this.loading = false
      }
    },
    handleRefresh() {
      this.loadData(true)
    },
    handleLoadMore() {
      if (!this.loading && !this.finished) {
        this.loadData()
      }
    }
  }
}
</script>虚拟滚动
用于处理大量数据,只渲染可见区域的列表项。
<neo-zlist-pro
  :list="list"
  :virtual="true"
  :item-height="100"
  @load-more="handleLoadMore"
>
  <template #default="{ item }">
    <view class="item" style="height: 100rpx;">
      {{ item.title }}
    </view>
  </template>
</neo-zlist-pro>注意:
- 必须设置 item-height(单位 rpx)
- 列表项必须固定高度
瀑布流布局
适用于图片流、商品列表等场景。
<neo-zlist-pro
  :list="list"
  :waterfall="true"
  :columns="2"
  :gap="20"
  @load-more="handleLoadMore"
>
  <template #default="{ item }">
    <view class="item">
      <image :src="item.image" mode="widthFix" />
      <text>{{ item.title }}</text>
    </view>
  </template>
</neo-zlist-pro>空态、错误态和加载完成
使用内置组件或自定义插槽。
<neo-zlist-pro :list="list" :finished="finished" :error="error">
  <template #default="{ item }">
    <view>{{ item }}</view>
  </template>
  <!-- 自定义空态 -->
  <template #empty>
    <neo-empty-state type="search" title="搜索无结果" />
  </template>
  <!-- 自定义错误态 -->
  <template #error>
    <neo-error-state @retry="handleRetry" />
  </template>
  <!-- 自定义"没有更多了" -->
  <template #finished>
    <view class="custom-finished">
      <text>✓ 已加载全部内容</text>
    </view>
  </template>
  <!-- 自定义"加载中" -->
  <template #loading>
    <view class="custom-loading">
      <text>正在加载...</text>
    </view>
  </template>
</neo-zlist-pro>自定义下拉刷新
组件内置了美观的下拉刷新动画,你也可以自定义。
<!-- 使用内置刷新动画(默认) -->
<neo-zlist-pro :list="list" @refresh="handleRefresh">
  <template #default="{ item }">
    <view>{{ item }}</view>
  </template>
</neo-zlist-pro>
<!-- 自定义刷新器 -->
<neo-zlist-pro :list="list" @refresh="handleRefresh">
  <template #default="{ item }">
    <view>{{ item }}</view>
  </template>
  <template #refresher="{ refreshing }">
    <view v-if="refreshing" class="my-refresher">
      <text>加载中...</text>
    </view>
  </template>
</neo-zlist-pro>
<!-- 使用原生刷新器 -->
<neo-zlist-pro 
  :list="list" 
  :use-custom-refresher="false"
  refresher-default-style="black"
  @refresh="handleRefresh"
>
  <template #default="{ item }">
    <view>{{ item }}</view>
  </template>
</neo-zlist-pro>API
neo-zlist-pro Props
| 参数 | 类型 | 默认值 | 说明 | 
|---|---|---|---|
| list | Array | [] | 列表数据 | 
| loading | Boolean | false | 是否正在加载 | 
| finished | Boolean | false | 是否已加载完全部数据 | 
| error | Boolean | false | 是否加载错误 | 
| refresherEnabled | Boolean | true | 是否启用下拉刷新 | 
| lowerThreshold | Number | 100 | 触底距离(px) | 
| useCustomRefresher | Boolean | true | 使用自定义刷新器 | 
| refresherDefaultStyle | String | none | 原生刷新器样式(black/white/none) | 
| refresherBackground | String | transparent | 刷新器背景色 | 
| pullingText | String | 下拉刷新 | 下拉时的文字 | 
| refreshingText | String | 加载中... | 刷新中的文字 | 
| showSkeleton | Boolean | true | 首次加载时显示骨架屏 | 
| skeletonRows | Number | 5 | 骨架屏行数 | 
| virtual | Boolean | false | 是否启用虚拟滚动 | 
| itemHeight | Number | 100 | 列表项高度(rpx,虚拟滚动必需) | 
| bufferSize | Number | 5 | 虚拟滚动缓冲区大小 | 
| waterfall | Boolean | false | 是否启用瀑布流 | 
| columns | Number | 2 | 瀑布流列数 | 
| gap | Number | 20 | 瀑布流列间距(rpx) | 
| height | String | 100% | 容器高度 | 
| background | String | - | 背景色 | 
neo-zlist-pro Events
| 事件名 | 参数 | 说明 | 
|---|---|---|
| refresh | - | 下拉刷新时触发 | 
| load-more | - | 触底加载时触发 | 
| scroll | event | 滚动时触发 | 
neo-zlist-pro Slots
| 插槽名 | 参数 | 说明 | 
|---|---|---|
| default | { item, index } | 列表项内容 | 
| refresher | { refreshing } | 自定义下拉刷新器 | 
| empty | - | 空态 | 
| error | - | 错误态 | 
| loading | - | 加载中提示 | 
| finished | - | 加载完成提示 | 
neo-zlist-pro Methods
| 方法名 | 参数 | 说明 | 
|---|---|---|
| scrollToTop | - | 滚动到顶部 | 
neo-empty-state Props
| 参数 | 类型 | 默认值 | 说明 | 
|---|---|---|---|
| type | String | empty | 类型:empty / search / network | 
| image | String | - | 自定义图片 URL | 
| title | String | - | 标题(默认根据 type 自动设置) | 
| description | String | - | 描述文字 | 
neo-error-state Props
| 参数 | 类型 | 默认值 | 说明 | 
|---|---|---|---|
| title | String | 加载失败 | 标题 | 
| description | String | - | 描述文字 | 
| buttonText | String | 重试 | 按钮文字 | 
neo-error-state Events
| 事件名 | 参数 | 说明 | 
|---|---|---|
| retry | - | 点击重试按钮时触发 | 
使用建议
- 数据管理:组件不处理数据请求,你需要在父组件中管理数据和状态
- 加载状态:首次加载(list 为空)显示骨架屏,后续加载(list 有数据)显示"加载中"提示
- finished 设置时机:⚠️ 重要!在数据加载完成后、loading=false之前设置finished,确保最后一页也能显示"加载中"
- 虚拟滚动:适用于 1000+ 条数据的场景,列表项必须固定高度
- 瀑布流:适用于图片流、商品列表,布局会自动优化
- 自定义刷新器:建议使用 v-if="refreshing"只在刷新时显示内容,避免遮挡列表
- 样式定制:列表项样式完全由插槽控制,可灵活定制
常见问题
1. 下拉刷新没反应?
确保正确处理 @refresh 事件,并在数据加载完成后更新 loading 和 list。
2. 虚拟滚动列表项高度不一致?
虚拟滚动要求列表项高度固定,如果高度不一致请使用普通模式。
3. 瀑布流图片显示不全?
使用 mode="widthFix" 让图片自适应宽度。
4. 如何自定义空态样式?
使用 #empty 插槽自定义空态内容。
许可
MIT License

 
                                                                     
                                                                                                                                                 收藏人数:
                                                                        收藏人数:
                                     下载插件并导入HBuilderX
                                                        下载插件并导入HBuilderX
                                                     赞赏(0)
                                        赞赏(0)
                                     
                                             
                                             
                                             
                                             
                                             下载 6
 下载 6
                 赞赏 0
 赞赏 0
                 
             
                     下载 10661039
                    下载 10661039 
                 赞赏 1797
                        赞赏 1797 
                     
             
                     
             
                     
             
                     
             
                     
             
                     
             
                     
             
                     
             
                     
             
                     
             
                     
             
                     
             
                     
             
                     
             
                     
                         赞赏
                                赞赏
                             
             京公网安备:11010802035340号
京公网安备:11010802035340号