更新记录

1.0.1(2025-07-10) 下载此版本

更新操作使用说明文档

1.0.0(2025-07-10) 下载此版本

uni滚动列表:支持自动加载、上拉加载、下拉刷新,高度可自定义,兼容多端。


平台兼容性

uni-app(4.45)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
-

uni-app x(4.51)

Chrome Safari Android iOS 鸿蒙 微信小程序
5.0 12 -

其他

多语言 暗黑模式 宽屏模式
× ×

HuimayunScroll 组件使用文档

概述

HuimayunScroll 是一个功能强大的滚动组件,基于 mescroll 封装,支持下拉刷新、上拉加载、标签页切换、空状态显示等功能。

安装与引入

1. 组件引入

<script>
import HuimayunScroll from "@/uni_modules/huimayun-scroll/components/huimayun-scroll/huimayun-scroll.vue";

export default {
  components: {
    HuimayunScroll,
  },
};
</script>

2. 基础使用

<template>
  <huimayun-scroll @down="handleRefresh" @up="handleLoadmore">
    <view v-for="item in dataList" :key="item.id" class="list-item">
      {{ item.title }}
    </view>
  </huimayun-scroll>
</template>

属性配置

标签页相关

属性名 类型 默认值 说明
tabs Array null 标签页数据数组
currentTab String '' 当前激活的标签页
showTabCount Boolean true 是否显示标签页数量
tabThemeColor String '#007aff' 标签页主题色

布局相关

属性名 类型 默认值 说明
topOffset Number/String 0 顶部偏移量
bottomOffset Number/String 0 底部偏移量
topbar Boolean true 是否启用顶部状态栏
safearea Boolean true 是否启用安全区域

功能配置

属性名 类型 默认值 说明
down Object {} 下拉刷新配置
up Object {} 上拉加载配置
empty Boolean/Object 见下方 空状态配置
error Boolean/Object 见下方 错误状态配置
backToTop Boolean/Object true 回到顶部按钮

事件

事件名 参数 说明
@down mescroll 下拉刷新触发
@up mescroll 上拉加载触发
@init mescroll 组件初始化完成
@scroll event 滚动事件
@update:currentTab value 标签页切换
@retry - 错误重试

使用示例

1. 基础滚动列表

<template>
  <huimayun-scroll @down="handleRefresh" @up="handleLoadmore">
    <view v-for="item in dataList" :key="item.id" class="list-item">
      <text>{{ item.title }}</text>
    </view>
  </huimayun-scroll>
</template>

<script>
export default {
  data() {
    return {
      dataList: [],
    };
  },
  methods: {
    // 下拉刷新
    handleRefresh(mescroll) {
      // 模拟网络请求
      setTimeout(() => {
        this.dataList = this.generateData(20);
        mescroll.endSuccess();
      }, 1000);
    },

    // 上拉加载
    handleLoadmore(mescroll) {
      // 模拟网络请求
      setTimeout(() => {
        const newData = this.generateData(10);
        this.dataList = this.dataList.concat(newData);
        mescroll.endSuccess(newData.length);
      }, 1000);
    },

    generateData(count) {
      const data = [];
      for (let i = 0; i < count; i++) {
        data.push({
          id: Date.now() + i,
          title: `数据项 ${i + 1}`,
        });
      }
      return data;
    },
  },
};
</script>

2. 带标签页的滚动列表

<template>
  <huimayun-scroll
    :tabs="tabs"
    :current-tab="currentTab"
    :show-tab-count="true"
    @down="handleRefresh"
    @up="handleLoadmore"
    @update:currentTab="handleTabChange"
  >
    <view v-for="item in filteredData" :key="item.id" class="list-item">
      <text>{{ item.title }}</text>
      <text class="status">{{ item.status }}</text>
    </view>
  </huimayun-scroll>
</template>

<script>
export default {
  data() {
    return {
      tabs: [
        { value: "all", label: "全部", count: 0 },
        { value: "active", label: "活跃", count: 0 },
        { value: "pending", label: "待处理", count: 0 },
        { value: "completed", label: "已完成", count: 0 },
      ],
      currentTab: "all",
      dataList: [],
    };
  },

  computed: {
    filteredData() {
      if (this.currentTab === "all") {
        return this.dataList;
      }
      return this.dataList.filter((item) => item.status === this.currentTab);
    },
  },

  methods: {
    handleTabChange(tab) {
      this.currentTab = tab;
      // 切换标签时重新加载数据
      this.loadData();
    },

    updateTabCounts() {
      const counts = {
        all: this.dataList.length,
        active: 0,
        pending: 0,
        completed: 0,
      };

      this.dataList.forEach((item) => {
        if (counts.hasOwnProperty(item.status)) {
          counts[item.status]++;
        }
      });

      this.tabs.forEach((tab) => {
        tab.count = counts[tab.value] || 0;
      });
    },
  },
};
</script>

3. 自定义配置

<template>
  <huimayun-scroll
    :down="downConfig"
    :up="upConfig"
    :empty="emptyConfig"
    :back-to-top="backToTopConfig"
    @down="handleRefresh"
    @up="handleLoadmore"
  >
    <view v-for="item in dataList" :key="item.id" class="list-item">
      {{ item.title }}
    </view>

    <!-- 自定义空状态 -->
    <template #empty>
      <view class="custom-empty">
        <image src="/static/empty.png" class="empty-icon"></image>
        <text class="empty-text">暂无数据</text>
      </view>
    </template>
  </huimayun-scroll>
</template>

<script>
export default {
  data() {
    return {
      dataList: [],

      // 下拉刷新配置
      downConfig: {
        use: true,
        auto: false,
        textInOffset: "下拉刷新",
        textOutOffset: "释放更新",
        textLoading: "加载中...",
        textSuccess: "刷新成功",
        bgColor: "#fff",
      },

      // 上拉加载配置
      upConfig: {
        use: true,
        auto: true,
        page: {
          num: 0,
          size: 10,
        },
        noMoreSize: 5,
        offset: 100,
        textLoading: "加载中...",
        textNoMore: "-- END --",
      },

      // 空状态配置
      emptyConfig: {
        title: "暂无数据",
        description: "当前没有可显示的内容",
        image: "/static/empty.png",
      },

      // 回到顶部配置
      backToTopConfig: {
        show: true,
        offset: 1000,
      },
    };
  },
};
</script>

方法调用

组件实例方法

<template>
  <huimayun-scroll ref="scrollRef">
    <!-- 内容 -->
  </huimayun-scroll>
</template>

<script>
export default {
  methods: {
    // 手动结束刷新
    endRefresh() {
      this.$refs.scrollRef.endSuccess();
    },

    // 手动结束加载
    endLoad(dataSize) {
      this.$refs.scrollRef.endSuccess(dataSize);
    },

    // 重置上拉加载
    resetLoad() {
      this.$refs.scrollRef.resetUpScroll();
    },

    // 滚动到顶部
    scrollToTop() {
      this.$refs.scrollRef.scrollToTop();
    },
  },
};
</script>

样式自定义

标签页样式

/* 自定义标签页样式 */
.huimayun-scroll ::v-deep .tab-menu {
  background: #f8f8f8;
  border-bottom: 1px solid #e0e0e0;
}

.huimayun-scroll ::v-deep .tab-item {
  padding: 15rpx 30rpx;
  font-size: 28rpx;
}

.huimayun-scroll ::v-deep .tab-item.active {
  color: #007aff;
  font-weight: 500;
}

.huimayun-scroll ::v-deep .tab-count {
  background: rgba(0, 122, 255, 0.1);
  color: #007aff;
}

空状态样式

.custom-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 100rpx 40rpx;
}

.empty-icon {
  width: 200rpx;
  height: 200rpx;
  margin-bottom: 30rpx;
}

.empty-text {
  font-size: 28rpx;
  color: #999;
}

注意事项

  1. 数据更新:在数据变化后记得调用 endSuccess()endErr() 方法
  2. 标签页数量:如果使用标签页功能,需要手动更新 count 字段
  3. 内存优化:大量数据时建议启用虚拟滚动模式
  4. 兼容性:组件基于 uni-app,支持多端运行
  5. 防抖处理:组件内置防抖机制,避免频繁触发刷新和加载

常见问题

Q: 如何禁用下拉刷新?

A: 设置 :down="{ use: false }"

Q: 如何自定义加载文案?

A: 通过 downup 配置对象的 textLoading 等属性

Q: 标签页数量不更新?

A: 需要手动更新 tabs 数组中每个对象的 count 属性

Q: 如何监听滚动位置?

A: 监听 @scroll 事件,通过 event.detail.scrollTop 获取位置

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无特殊权限要求

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

不收集用户数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无广告

许可协议

MIT协议

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问