axios+store+loading的配置

介绍

在程序中一般会对响应时间比较长的操作进行loading的配置,避免用户的重复操作。

配置store

添加一个store/index.js文件

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    // 全局的load变量
    isAppending: false
  },
  getters: {
  },
  mutations: {
    // 修改load变量的值
    changeAppending(state, bool) {
      state.isAppending = bool;
    }
  },

})

main.js引入

import store from '@/store/index.js'

new Vue({
  store,
  router,
  render: h => h(App)
}).$mount('#app')

在axios的拦截器中配置

import store from '../store/index'

// request拦截器  可对请求进行相应的处理
axios.interceptors.request.use(
  function (config) {
    config.withCredentials = true
    // 默认永不超时
    config.timeout = 0
    let val = window.sessionStorage.getItem('tokenValue')
    let key = window.sessionStorage.getItem('tokenName')
    let token = {}
    Vue.set(token, key, val)
    if (token) {
      config.headers = token
    }

    // 设置全局的load变量值为true,也就是开启load
    store.commit("changeAppending", true);

    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)
//response拦截器
axios.interceptors.response.use(
  function (response) {
    // 设置全局的load变量值为false,也就是关闭load
    store.commit("changeAppending", false);

    if (response.data.code === 0) {
      return response
    }
    if (response.data.code === -1) {
      router.replace({
        name: 'login'
      });
    }
    Message({
      type: 'error',
      message: response.data.message,
      showClose: true,
    })

    // 将未处理的异常往外抛
    return Promise.reject(response)
  },
  function (error) {
    // 设置全局的load变量值为false,也就是关闭load
    store.commit("changeAppending", false);

    // todo: 做一些其他日志记录处理
    Message({
      type: 'error',
      message: '服务器错误,' + error,
      showClose: true,
    })
  }
)

组件使用

直接绑定在需要load的标签上

 <a-button type="primary" @click="submit" style="margin-right: 10px" :loading="$store.state.isAppending">确 定</a-button>
posted @ 2022-06-28 19:00  purple910  阅读(230)  评论(0编辑  收藏  举报