Skip to content

ZInfiniteScroll 无限滚动

滚动至底部时,加载更多数据。

😅 数据太多时会出现卡顿,等找到合适的方法后在对它优化,目前仅适用于充当个分页器之类的~

基础用法

要实现滚动加载的效果,需绑定 change 事件用于接收loadMore,且需设置 height 属性。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
<template>
  <z-infinite-scroll height="300px" @change="loadMore">
    <ul class="ul-box">
      <li v-for="item in step" :key="item">{{item}}</li>
    </ul>
  </z-infinite-scroll>
</template>

<script setup lang="ts">
import { ref } from "vue";

const step = ref(6);
const loadMore = () => {
  step.value += 5;
};
</script>

<style scoped>
.ul-box {
  list-style: none;
  display: grid;
  grid-template-columns: 1fr;
  grid-gap: 12px;
}

.ul-box li {
  background: #ecf5ff;
  padding: 8px 0px;
  text-align: center;
}
</style>

隐藏滚动条

添加属性 showScrollbar 隐藏滚动条。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
<template>
  <z-infinite-scroll height="300px" @change="loadMore" :show-scrollbar="false">
    <ul class="ul-box">
      <li v-for="item in step" :key="item">{{item}}</li>
    </ul>
  </z-infinite-scroll>
</template>

<script setup lang="ts">
import { ref } from "vue";

const step = ref(6);
const loadMore = () => {
  step.value += 5;
};
</script>

<style scoped>
.ul-box {
  list-style: none;
  display: grid;
  grid-template-columns: 1fr;
  grid-gap: 12px;
}

.ul-box li {
  background: #ecf5ff;
  padding: 8px 0px;
  text-align: center;
}
</style>

加载状态

在请求数据时,可搭配属性 loading 使用,同时支持使用 loading 插槽进行自定义效果。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
<template>
  <z-infinite-scroll height="300px" @change="loadMore" :loading="loading">
    <ul class="ul-box">
      <li v-for="item in step" :key="item">{{item}}</li>
    </ul>
  </z-infinite-scroll>
</template>

<script setup lang="ts">
import { ref } from "vue";

const step = ref(6);
const loading = ref(false);
const loadMore = () => {
  loading.value = true;
  setTimeout(() => {
    loading.value = false;
    step.value += 5;
  }, 3000);
};
</script>

<style scoped>
.ul-box {
  list-style: none;
  display: grid;
  grid-template-columns: 1fr;
  grid-gap: 12px;
}

.ul-box li {
  background: #ecf5ff;
  padding: 8px 0px;
  text-align: center;
}
</style>

自定义loading

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
<template>
  <z-infinite-scroll height="300px" @change="loadMore" :loading="loading">
    <ul class="ul-box">
      <li v-for="item in step" :key="item">{{item}}</li>
    </ul>

    <template #loading>
      <span>数据载入中...</span>
    </template>
  </z-infinite-scroll>
</template>

<script setup lang="ts">
import { ref } from "vue";

const step = ref(6);
const loading = ref(false);
const loadMore = () => {
  loading.value = true;
  setTimeout(() => {
    loading.value = false;
    step.value += 5;
  }, 3000);
};
</script>

<style scoped>
.ul-box {
  list-style: none;
  display: grid;
  grid-template-columns: 1fr;
  grid-gap: 12px;
}

.ul-box li {
  background: #ecf5ff;
  padding: 8px 0px;
  text-align: center;
}
</style>

API 属性

属性名说明类型默认值
width容器宽度string100%
height容器高度string100%
showScrollbar显示滚动条booleantrue
loading加载状态boolean

slot 插槽

插槽名说明参数
default默认插槽,自定义数据列表
loading自定义loading内容

event 事件

事件名称说明回调参数
change触底时触发() => void