转载:https://www.jianshu.com/p/35fd3b541c24
效果图
实现
-
编写动画效果
// src/components/loading.vue <template> <div class="loading"></div> </template> <script> export default {}; </script> <style lang="less" scoped> .loading { position: absolute; top: 0; left: 0; bottom: 0; right: 0; background-color: rgba(255, 255, 255, 0.5); background-image: url(".././assets/loading.gif"); background-repeat: no-repeat; background-position: center; } </style>
-
vuex 控制动画显示隐藏
// src/store/index.js import Vue from "vue"; import Vuex from "vuex"; Vue.use(Vuex); export default new Vuex.Store({ state: { isShow: false }, mutations: {}, actions: {}, modules: {} });
-
配置 axios 拦截器
// src/api/request/js import axios from "axios"; import router from "@/router"; import store from "../store"; axios.interceptors.request.use(function(config) { store.state.isShow = true; return config; }); axios.interceptors.response.use( function(response) { store.state.isShow = false; return response; }, function(error) { if (error) { window.localStorage.removeItem("username"); router.push("/login"); } return Promise.reject(error); } ); export default axios;
-
app.vue 引入 loading.vue 组件
// App.vue <template> <div id="app"> <router-view /> <loading v-if="this.$store.state.isShow" /> </div> </template> <script> import Loading from "./components/loading.vue"; export default { name: "App", components: { Loading } }; </script>