一个功能完备的uni-app滚动视图组件,支持自定义下拉刷新、上拉加载更多和虚拟列表(Virtual List)功能。

更新记录

1.0.0(2025-12-04) 下载此版本

初始功能


平台兼容性

uni-app(4.66)
Vue2Vue3ChromeSafariapp-vueapp-nvueAndroidiOS鸿蒙
--------
微信小程序支付宝小程序抖音小程序百度小程序快手小程序京东小程序鸿蒙元服务QQ小程序飞书小程序快应用-华为快应用-联盟
-----------

liaction-sv

一个功能完备的uni-app滚动视图组件,支持自定义下拉刷新、上拉加载更多和虚拟列表(Virtual List)功能。

功能特性

  • ✨ 自定义下拉刷新
  • 📱 上拉加载更多
  • 🔝 返回顶部按钮
  • 🎨 可配置的加载图标和文字
  • 🔄 支持外部调用刷新和加载更多方法
  • 📋 支持虚拟列表(Virtual List)功能

基本用法

安装组件

通过uni_modules方式引入组件。

使用示例

<template>
  <view class="container">
    <liaction-sv ref="scrollView" @refresh="onRefresh" @loadMore="onLoadMore" :enableRefresher="true" :enableLoadingMore="true">
      <!-- 内容区域 -->
      <view v-for="(item, index) in list" :key="index" class="list-item">
        <text>{{ item }}</text>
      </view>
    </liaction-sv>
  </view>
</template>

<script>
export default {
  data() {
    return {
      list: []
    };
  },
  methods: {
    // 下拉刷新
    onRefresh() {
      // 模拟数据获取
      setTimeout(() => {
        this.list = ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5'];
        // 结束刷新
        this.$refs.scrollView.finishRefresh();
      }, 1000);
    },
    // 上拉加载更多
    onLoadMore() {
      // 模拟数据获取
      setTimeout(() => {
        this.list = [...this.list, 'More Item 1', 'More Item 2', 'More Item 3'];
        // 结束加载,传入false表示没有更多数据
        this.$refs.scrollView.finishLoadMore(true);
      }, 1000);
    }
  }
};
</script>

<style>
.container {
  width: 100%;
  height: 100vh;
}

.list-item {
  padding: 20px;
  border-bottom: 1px solid #eee;
}
</style>

虚拟列表使用说明

固定高度模式

当设置 itemHeight 为固定值时,组件会使用固定高度模式,性能最优:

<liaction-sv :enableVirtualList="true" :itemHeight="60" :dataSource="list">
  <template #virtual-list="{ data }">
    <!-- 虚拟列表项内容 -->
  </template>
</liaction-sv>

自动高度模式

当 itemHeight 设为 0 时,组件会启用自动高度模式,自动测量每个列表项的实际高度:

<liaction-sv :enableVirtualList="true" :itemHeight="0" :dataSource="list">
  <template #virtual-list="{ data }">
    <!-- 虚拟列表项内容,高度不固定 -->
  </template>
</liaction-sv>

属性说明

属性名类型默认值说明
showHeaderBooleanfalse是否显示头部区域
showFooterBooleanfalse是否显示底部区域
enableRefresherBooleanfalse是否启用下拉刷新
enableLoadingMoreBooleanfalse是否启用上拉加载更多
enableVirtualListBooleanfalse是否启用虚拟列表功能
itemHeightNumber0虚拟列表项高度(设置为0时启用自动高度计算)
dataSourceArray[]虚拟列表数据源
showFixedAreaBooleanfalse是否显示右下角固定区域
showBackTopBooleanfalse是否显示返回顶部按钮
showScrollbarBooleanfalse是否显示滚动条
loadingTextString'加载中...'上拉加载时显示的文本
noMoreTextString'没有更多数据了'没有更多数据时显示的文本
refresherTextPullingString'下拉刷新'下拉过程中显示的文本
refresherTextReleaseString'松手刷新'准备刷新时显示的文本
refresherTextRefreshingString'刷新中...'刷新过程中显示的文本
loadingIconColorString'#666'加载图标的默认颜色
refresherIconColorString''下拉刷新图标的颜色,优先级高于loadingIconColor
loadingMoreIconColorString''上拉加载图标的颜色,优先级高于loadingIconColor

方法说明

方法名参数说明
scrollToTop-滚动到顶部
scrollTo{ scrollTop: Number }滚动到指定位置
startRefreshrefresherText?: String开始下拉刷新,可传入自定义刷新文本
finishRefresh-结束下拉刷新
startLoadMoreloadingText?: String开始上拉加载更多,可传入自定义加载文本
finishLoadMorehasMore?: Boolean结束上拉加载更多,传入false表示没有更多数据
measureItemHeight(index: Number, height: Number)手动测量并更新列表项高度(主要用于自动高度模式)

事件说明

事件名说明
scrolltoupper滚动到顶部时触发
scrolltolower滚动到底部时触发
refresherpulling下拉刷新过程中触发
refresherrefresh下拉刷新开始时触发
refresherrestore下拉刷新结束时触发
refresherabort下拉刷新中止时触发
scroll滚动时触发,返回滚动事件对象
refresh下拉刷新开始时触发,与refresherrefresh相同
loadMore上拉加载开始时触发,与scrolltolower相同

组件结构

<liaction-sv>
  <template #header>
    <!-- 自定义头部内容 -->
  </template>

  <!-- 主体内容区域 -->

  <template #virtual-list="{ data }">
    <!-- 虚拟列表项内容 -->
    <!-- data 格式: [{ item: dataItem, index: originalIndex }, ...] -->
  </template>

  <template #footer>
    <!-- 自定义底部内容 -->
  </template>

  <template #backTop>
    <!-- 自定义返回顶部按钮内容 -->
  </template>

  <template #beforeBackTop>
    <!-- 返回顶部按钮上方的固定区域 -->
  </template>

  <template #afterBackTop>
    <!-- 返回顶部按钮下方的固定区域 -->
  </template>
</liaction-sv>

注意事项

  • 组件基于scroll-view,请遵循scroll-view规范
  • 默认不启用下拉刷新和上拉加载更多功能,可当普通scroll-view用

虚拟列表注意事项

  1. 性能优化
    • 优先使用固定高度模式(设置itemHeight为固定值),性能最优
    • 自动高度模式会带来一定的性能开销,建议仅在列表项高度差异较大时使用
    • 建议数据源item数量较大时使用虚拟列表,否则普通列表性能更好

外部调用示例

// 开始下拉刷新
this.$refs.scrollView.startRefresh('正在刷新...');

// 结束下拉刷新
this.$refs.scrollView.finishRefresh();

// 开始上拉加载更多
this.$refs.scrollView.startLoadMore('正在加载更多...');

// 结束上拉加载更多(有更多数据)
this.$refs.scrollView.finishLoadMore(true);

// 结束上拉加载更多(没有更多数据)
this.$refs.scrollView.finishLoadMore(false);

// 滚动到顶部
this.$refs.scrollView.scrollToTop();

// 滚动到指定位置
this.$refs.scrollView.scrollTo({ scrollTop: 200 });

许可证

MIT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值