vue-loading-overlay vs vue-spinner
Vue Loading Indicators Comparison
1 Year
vue-loading-overlayvue-spinner
What's Vue Loading Indicators?

Vue loading indicators are essential components in web development that provide visual feedback to users during asynchronous operations, such as data fetching or processing tasks. These packages help enhance user experience by indicating that a task is in progress, thereby preventing user frustration due to unresponsiveness. Both 'vue-loading-overlay' and 'vue-spinner' serve this purpose but with different approaches and customization options, catering to various design preferences and functional requirements.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
vue-loading-overlay49,7131,26257.5 kB49 months agoMIT
vue-spinner33,7991,812-205 years agoMIT
Feature Comparison: vue-loading-overlay vs vue-spinner

Customization

  • vue-loading-overlay:

    Offers extensive customization options, including the ability to change colors, sizes, and the content displayed within the overlay. You can also control the opacity and position of the overlay, making it adaptable to different UI designs and requirements.

  • vue-spinner:

    Provides a selection of predefined spinner styles, allowing for quick implementation. However, customization is limited compared to 'vue-loading-overlay', focusing primarily on spinner animations rather than overlay features.

Use Cases

  • vue-loading-overlay:

    Ideal for scenarios where you need to block user interaction during loading processes, such as form submissions or data fetching. It can be applied to specific components or the entire viewport, making it versatile for various applications.

  • vue-spinner:

    Best suited for situations where you want to indicate loading without blocking user interaction. It can be used alongside other UI elements, such as buttons or forms, to show that a background process is ongoing.

Integration

  • vue-loading-overlay:

    Easily integrates with Vue.js applications and can be used with Vuex for state management, allowing for centralized control over loading states across the application.

  • vue-spinner:

    Simple to integrate and use within Vue components, requiring minimal setup. It can be easily added to existing components without significant changes to the application structure.

Performance

  • vue-loading-overlay:

    May introduce slight overhead due to the overlay covering the entire screen or component, but this is generally minimal and outweighed by the benefits of improved user experience during loading times.

  • vue-spinner:

    Lightweight and efficient, as it focuses solely on rendering spinner animations without additional overhead from overlays, making it suitable for performance-sensitive applications.

User Experience

  • vue-loading-overlay:

    Enhances user experience by clearly indicating that a process is ongoing, preventing user actions that could disrupt the loading process. The overlay can also include messages or progress indicators to keep users informed.

  • vue-spinner:

    Provides a simple yet effective way to indicate loading, maintaining user engagement without overwhelming them with additional information. It’s a straightforward solution for applications that prioritize minimalism.

How to Choose: vue-loading-overlay vs vue-spinner
  • vue-loading-overlay:

    Choose 'vue-loading-overlay' if you need a versatile overlay that can be easily integrated into your application. It allows for customization of the overlay's appearance and can be used to cover the entire screen or specific components, making it suitable for various use cases where you want to block user interaction during loading.

  • vue-spinner:

    Choose 'vue-spinner' if you prefer a lightweight solution focused solely on displaying spinners. It offers a variety of spinner designs and is ideal for scenarios where you want to provide a simple loading animation without additional overlay features.

README for vue-loading-overlay

Vue Loading Overlay Component

downloads jsdelivr npm-version github-tag build license TypeScript

Vue.js component for full screen loading indicator

Demo or JSFiddle

Version matrix

| Vue.js version | Package version | Branch | | :--- |:---------------:|-----------------------------------------------------------------:| | 2.x | 3.x | 3.x | | 3.x | 6.x | main |

Installation

npm install vue-loading-overlay@^6.0 

Usage

As component


<template>
    <div class="vl-parent">
        <loading v-model:active="isLoading"
                 :can-cancel="true"
                 :on-cancel="onCancel"
                 :is-full-page="fullPage"/>

        <label><input type="checkbox" v-model="fullPage">Full page?</label>
        <button @click.prevent="doAjax">fetch Data</button>
    </div>
</template>

<script>
    import Loading from 'vue-loading-overlay';
    import 'vue-loading-overlay/dist/css/index.css';

    export default {
        data() {
            return {
                isLoading: false,
                fullPage: true
            }
        },
        components: {
            Loading
        },
        methods: {
            doAjax() {
                this.isLoading = true;
                // simulate AJAX
                setTimeout(() => {
                    this.isLoading = false
                }, 5000)
            },
            onCancel() {
                console.log('User cancelled the loader.')
            }
        }
    }
</script>

As plugin

Initialise the plugin in your app

import {createApp} from 'vue';
import {LoadingPlugin} from 'vue-loading-overlay';
import 'vue-loading-overlay/dist/css/index.css';
// Your app initialization logic goes here
const app = createApp({});
app.use(LoadingPlugin);
app.mount('#app');

Then use the plugin in your components


<template>
    <form @submit.prevent="submit"
          class="vl-parent"
          ref="formContainer">
        <!-- your form inputs goes here-->
        <label><input type="checkbox" v-model="fullPage">Full page?</label>
        <button type="submit">Login</button>
    </form>
</template>

<script>
    export default {
        data() {
            return {
                fullPage: false
            }
        },
        methods: {
            submit() {
                let loader = this.$loading.show({
                    // Optional parameters
                    container: this.fullPage ? null : this.$refs.formContainer,
                    canCancel: true,
                    onCancel: this.onCancel,
                });
                // simulate AJAX
                setTimeout(() => {
                    loader.hide()
                }, 5000)
            },
            onCancel() {
                console.log('User cancelled the loader.')
            }
        }
    }
</script>

or same with Composition API

<script setup>
    import {ref, inject} from 'vue'
    import {useLoading} from 'vue-loading-overlay'
    
    const $loading = useLoading({
        // options
    });
    // or use inject without importing useLoading
    // const $loading =  inject('$loading')

    const fullPage = ref(false)

    const submit = () => {
        const loader = $loading.show({
            // Optional parameters
        });
        // simulate AJAX
        setTimeout(() => {
            loader.hide()
        }, 5000)
    }
</script>

Available props

The component accepts these props:

| Attribute | Type | Default | Description | | :--- | :---: | :---: | :--- | | active | Boolean | false | Show loading by default when true, use it as v-model:active | | can-cancel | Boolean | false | Allow user to cancel by pressing ESC or clicking outside | | on-cancel | Function | ()=>{} | Do something upon cancel, works in conjunction with can-cancel | | is-full-page | Boolean | true | When false; limit loader to its container^ | | transition | String | fade | Transition name | | color | String | #000 | Customize the color of loading icon | | height | Number | * | Customize the height of loading icon | | width | Number | * | Customize the width of loading icon | | loader | String | spinner | Name of icon shape you want use as loader, spinner or dots or bars | | background-color | String | #fff | Customize the overlay background color | | opacity | Number | 0.5 | Customize the overlay background opacity | | z-index | Number | 9999 | Customize the overlay z-index | | enforce-focus | Boolean | true | Force focus on loader | | lock-scroll | Boolean | false | Freeze the scrolling during full screen loader |

  • ^When is-full-page is set to false, the container element should be positioned as position: relative. You can use CSS helper class vl-parent.
  • *The default height and width values may vary based on the loader prop value

Available slots

The component accepts these slots:

  • default - Replace the animated icon with yours
  • before - Place anything before the animated icon, you may need to style this.
  • after - Place anything after the animated icon, you may need to style this.

API methods

this.$loading.show(?propsData,?slots)

import {h} from 'vue';

let loader = this.$loading.show({
    // Pass props by their camelCased names
    container: this.$refs.loadingContainer,
    canCancel: true, // default false
    onCancel: this.yourCallbackMethod,
    color: '#000000',
    loader: 'spinner',
    width: 64,
    height: 64,
    backgroundColor: '#ffffff',
    opacity: 0.5,
    zIndex: 999,
}, {
    // Pass slots by their names
    default: h('your-custom-loader-component-name'),
});
// hide loader whenever you want
loader.hide();

Global configs

You can set props and slots for all future instances when using as plugin

app.use(LoadingPlugin, {
    // props
    color: 'red'
}, {
    // slots
})

Further you can override any prop or slot when creating new instances

let loader = this.$loading.show({
    color: 'blue'
}, {
    // override slots
});

Use directly in browser (with CDN)

<!-- Vue js -->
<script src="https://cdn.jsdelivr.net/npm/vue@3.3"></script>
<!-- Lastly add this package -->
<script src="https://cdn.jsdelivr.net/npm/vue-loading-overlay@6"></script>
<link href="https://cdn.jsdelivr.net/npm/vue-loading-overlay@6/dist/css/index.css" rel="stylesheet">
<!-- Init the plugin and component-->
<script>
    const app = Vue.createApp({});
    app.use(VueLoading.LoadingPlugin);
    app.component('loading', VueLoading.Component)
    app.mount('#app')
</script>

Run examples on your localhost

  • Clone this repo
  • Make sure you have node-js >=20.11 and pnpm >=8.x pre-installed
  • Install dependencies pnpm install
  • Run webpack dev server npm start
  • This should open the demo page in your default web browser

Testing

  • This package is using Jest and vue-test-utils for testing.
  • Execute tests with this command npm test

License

MIT License