vue-3-infinite-scroll-directive-plugin

Vue 3 plugin to help implementing an infinite scroll
25,994
Install
npm install vue-3-infinite-scroll-directive-plugin
Latest Version:1.0.6
Vue:3
License:MIT
Last Updated:Mar 9, 2024
Links: GitLab  ·  npm
Maintainer: totol.toolsuite

Vue 3 Infinite Scroll Plugin

A Vue 3 directive for implementing infinite scroll functionality.

Test it by yourself

Test the directive by yourself in this sandbox

Demo

Installation

npm install npm i vue-3-infinite-scroll-directive-plugin
yarn add npm i vue-3-infinite-scroll-directive-plugin

Usage

Import and Register the Plugin In your main application file (e.g., main.ts or main.js), import and register the plugin:

import { createApp } from 'vue';
import App from './App.vue';
import { infiniteScrollPlugin } from 'vue-3-infinite-scroll-directive-plugin';

createApp(App).use(infiniteScrollPlugin).mount('#app');

Directive Usage

Add the v-infinite-scroll directive to the scrollable element in your template. Specify the handler function to be called when the bottom of the element is reached.

<template>
  <div v-infinite-scroll="handleInfiniteScroll" 
    data-infinite-scroll-margin="20" 
    data-infinite-scroll-delay="200" 
    :data-infinite-scroll-disabled="isLoading">
    <!-- Your content here -->
  </div>
  <div class="loader-wrapper" v-if="isLoading">
    <span class="loader"></span>
  </div>
</template>

Example Setup

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

  const todos = ref([]);
  const nextPage = ref(1);
  const isLoading = ref(false);

  const handleInfiniteScroll = async () => {
    isLoading.value = true;

    const data = await (await fetch(`https://jsonplaceholder.typicode.com/todos/${nextPage.value}`)).json();
    todos.value.push(data);
    nextPage.value++;

    setTimeout(() => {
      isLoading.value = false;
    }, Math.random() * 2000);
  };
</script>
<template>
  <div v-infinite-scroll="handleInfiniteScroll" 
    data-infinite-scroll-margin="20" 
    data-infinite-scroll-delay="200" 
    :data-infinite-scroll-disabled="isLoading"
  >
    <ul>
      <li  v-for="todo in todos" :key="todo.id"  class="todo">
        <div>
          {{ todo.title }}
        </div>
      </li>
    </ul>
  </div>
  <div class="loader-wrapper" v-if="isLoading">
    <span class="loader"></span>
  </div>
</template>

Options

  • v-infinite-scroll: Pass the callback to execute when bottom is reached

  • data-infinite-scroll-margin: Set the margin (in pixels) from the bottom of the scrollable element to trigger the infinite scroll. Default is 0.

  • data-infinite-scroll-delay: Set the delay (in milliseconds) before allowing another infinite scroll trigger. Default is 2000.

  • data-infinite-scroll-disabled: Bind this attribute to a variable to enable/disable infinite scroll based on its truthiness.

Types

export type ScrollableHtmlElement = HTMLElement & { __v_destroyInfiniteScrollObserver?: Function };

Cleanup

The plugin takes care of disconnecting the observer and removing the event listener when the component is destroyed.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Related Packages

vue-fun-loading

all kinds of loading components of vue

1,536 1
ajax-loading

a ajax-loading plugin for vue.js project

1,494
vue-loading-spin

'vue-loading-spin'是一个基于VUE实现的加载提示组件,也可以作为组件。

792 14
auth-analytic-vue

Authentication plugin for analytic dev

568 0
@tw666/vuex-loading

自动处理 vuex action中的 loading 状态,不用一遍遍地写 showLoading 和 hideLoading

272

Version History

Version Released Vue License
1.0.6 ^3.4.19 MIT
1.0.5 ^3.4.19 MIT
1.0.4 ^3.4.19 MIT
1.0.3 ^3.4.19 MIT
1.0.2 ^3.4.19 MIT