Vue3+Axios+Element-Plus 实现全局loading加载

4,627 阅读1分钟

在前端开发工作中,请求接口时,为了提高页面的观赏性和用户的体验,我们会在页面上添加loading来阻止用户操作来等待接口的返回。

首先我们需要引入element-ui的Loading组件,这个组件有两种调用方式:

1、通过指令v-loading

2、通过服务Loading.service();

目的:实现局部loading加载效果,如果使用方法2会整个页面都出现加载效果,这里我只想在路由切换区域局部出现加载效果,故采用方法1 v-loading

使用方法1时存在问题,报错Can‘t resolve ‘element-plus/es/components/loading-directive/style/index‘

解决办法:这里采用自定义load指令,给Element-Plus提供的指令基础上再封装一层(其他解决方法可参考:element-plus(1.3.0-beta.5)按需引入,v-loading报错 - 掘金 (juejin.cn)):

main.js文件:

import { createApp } from 'vue'
import { vLoading } from 'element-plus/es/components/loading/src/directive' // 按需引入loading组件
const app = createApp(App)
app.directive('load', vLoading) // 自定义load指令

image.png

使用自定义指令,在请求某个接口的时候,将 loading 改为true,当接口请求后改为false,这样就能实现loading的过渡效果了。

loading 可以存储在vuex中,在index.vue中使用computed监听loading变化实现显示隐藏效果。

使用指令,computed监听loading的状态。

Vuex 中 state 是动态更新的,也就是不管在任何地方对某一个state的值做了修改,那么依赖该数据的 DOM 也将会发生改变。 image.png

store

image.png

loading.js

image.png

axios.js

这里setTimeout仅用于查看效果,实际开发中要去掉

image.png

image.png