我想要实现发生Ajax请求的时候显示加载框,而当得到Ajax响应时关闭。

VUE-SPINTER很漂亮,但是我找不到相关方法的文档,而且,选项配置也不友好。有什么解决方案吗?

2021-01-06 12:59创建
共2个回答
UJ
游客uJLTPs

你可以使用Vue实例的event bus来实现。

首先在eventhub.js创建一个Event Bus Vue实例

export const eventHub = new Vue();

其次在Axios模块中通过拦截器激发事件

import { eventHub } from 'eventhub'

function createAxios() {
    const axios = Axios.create({ ... });
    axios.interceptors.request.use(
        conf => {
            eventHub.$emit('before-request');
            return conf;
        },
        error => {
            eventHub.$emit('request-error');
            return Promise.reject(error);
        }
    );
    axios.interceptors.response.use(
        response => {
            eventHub.$emit('after-response');
            return response;
        },
        error => {
            eventHub.$emit('response-error');
            return Promise.reject(error);
        }
    );
    return axios;
}

最后,在App.vue中监听相关事件

import { eventHub } from 'utils/eventhub'

export default {
    data () {
        return { spinnerVisible: false }
    },
    methods: {
        showSpinner() {
            console.log('show spinner');
            this.spinnerVisible = true;
        },
        hideSpinner() {
            console.log('hide spinner');
            this.spinnerVisible = false;
        }
    },
    created() {
        eventHub.$on('before-request', this.showSpinner);
        eventHub.$on('request-error',  this.hideSpinner);
        eventHub.$on('after-response', this.hideSpinner);
        eventHub.$on('response-error', this.hideSpinner);
    },
    beforeDestroy() {
        eventHub.$off('before-request', this.showSpinner);
        eventHub.$off('request-error',  this.hideSpinner);
        eventHub.$off('after-response', this.hideSpinner);
        eventHub.$off('response-error', this.hideSpinner);
    }
}