element-ui使用axios进行全局控制loading

2020-05-30 00:27
2857
0
5

在我们的后台管理经常有非常多得table,但是我们不想每个table都设置一个loading,包括其他增删改查都需要loading来提升用户体验和避免重复操作

我们使用的是vue-cli+element-ui的方式,需要对element-ui的loading.service的样式进行一下调整

在App.vue里面

.el-loading-mask{background: transparent}
.el-loading-spinner{
  width: 150px;
  padding: 20px 0;
  left: 0;
  right: 0;
  margin: auto;
  background:#fff;
  border-radius: 10px;
  border: 1px solid #eee;
  box-shadow: 0 0 30px #ccc;
  i{
    font-size: 30px;
    margin-bottom: 5px;
  }
}


我们通过vuex来控制loading

store.js

export default new Vuex.Store({
  state: {
    loading: '',
    isLoading: false,
  },
  mutations: {
   showLoading(state) {
      state.loading = Loading.service({
        text: '加载中...',
        lock: true,
        spinner: 'el-icon-loading',
      })
      console.log('loading start')
      state.isLoading = true
    },
    hideLoading(state) {
      if (state.isLoading) {
        console.log('loading close')
        state.loading.close()
        state.isLoading = false
      }
    },
  }
})


然后在axios拦截器里面进行设置,request.js

import axios from 'axios'
import router from '../router'
import store from '../store'
import { Message } from 'element-ui'

// (添加请求拦截器)
axios.interceptors.request.use((config) => {
  const { headers, params, data } = config
  headers.common.Authorization = store.state.token
  if ((params && params.loading) || (data && data.loading)) {
    store.commit('showLoading')
  }
    return config;
  }, (error) => {
    store.commit('hideLoading')
    return Promise.reject(error)
  },
);

// 添加响应拦截器
axios.interceptors.response.use(({ data, config: { params, data : res } }) => {
  if ((params && params.loading) || (res && res.loading) || (res && res.indexOf('loading') > -1)) {
    store.commit('hideLoading')
  }
  if (data.sys_code === 401) {
    router.replace({ path: '/login' })
    store.dispatch('resetUserInfo')
    return Promise.reject(data)
  }
  if (data.code !== 0) {
    if (data.sys_code === 1204) {
      router.replace({ path: `/404?code=403&title=${data.message}` })
    }
    Message({ message: data.message, type: 'error'})
    return Promise.reject(data)
  }
  return data
}, (error) => {
  // 请求错误时做些事
  let errMsg = ''
  const str = error.toString();
  if (str.indexOf('timeout') > 0) {
    errMsg = '请求超时,请刷新后重试!'
  } else {
    errMsg = '服务器内容部错误!'
  }
  Message({ message: error.message || errMsg, type: 'error'})
  store.commit('hideLoading')
  return Promise.reject(error)
});


最后我们只需要在请求的参数上面加上loading: true就可以显示loading了

使用方法

methods: {
  async getList() {
    const { data: { items } } = await this.$api.role.list({ params: { loading: true }})
    this.list = items
  }
}


显示效果



码字不易,给个赞吧

支付宝微信
5
关注公众号获取更多内容
uniapp点击输入框时键盘不上推页面
结合lazyload实现文章页里面的图片预加载
暂无评论,快抢沙发吧
不支持canvas
春季
夏季
秋季
冬季
暗黑
简约
小清新