我们使用的是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 } }
显示效果
码字不易,给个赞吧