Vue 全局loading组件实例详解
程序员文章站
2022-05-25 22:24:34
上图不上种,菊花万人捅:
loading.js:
import './loading.css'
let loading = {}
// 避免重复ins...
上图不上种,菊花万人捅:
loading.js:
import './loading.css' let loading = {} // 避免重复install,设立flag loading.installed = false loading.install = function (vue) { if (loading.installed) return vue.prototype.$loading = {} vue.prototype.$loading.show = () => { // 如果页面有loading则不继续执行 if (document.queryselector('#vue-loading')) return // 1、创建构造器,定义loading模板 let loadingtip = vue.extend({ template: `<div id="vue-loading"> <div class="loader"></div> </div>` }) // 2、创建实例,挂载到文档以后的地方 let tpl = new loadingtip().$mount().$el // 3、把创建的实例添加到body中 document.body.appendchild(tpl) // 阻止遮罩滑动 document.queryselector('#vue-loading').addeventlistener('touchmove', function (e) { e.stoppropagation() e.preventdefault() }) loading.installed = true } vue.prototype.$loading.hide = () => { let tpl = document.queryselector('#vue-loading') document.body.removechild(tpl) } } export default loading
loading.css:
#vue-loading { width: 100%; height: 100%; position: absolute; left: 0; top: 0 } .loader { position: relative; width: 2.5em; height: 2.5em; transform: rotate(165deg); } .loader:before, .loader:after { content: ''; position: absolute; top: 50%; left: 50%; display: block; width: 0.5em; height: 0.5em; border-radius: 0.25em; transform: translate(-50%, -50%); } .loader:before { animation: before 2s infinite; } .loader:after { animation: after 2s infinite; } @keyframes before { 0% { width: 0.5em; box-shadow: 1em -0.5em rgba(225, 20, 98, 0.75), -1em 0.5em rgba(111, 202, 220, 0.75); } 35% { width: 2.5em; box-shadow: 0 -0.5em rgba(225, 20, 98, 0.75), 0 0.5em rgba(111, 202, 220, 0.75); } 70% { width: 0.5em; box-shadow: -1em -0.5em rgba(225, 20, 98, 0.75), 1em 0.5em rgba(111, 202, 220, 0.75); } 100% { box-shadow: 1em -0.5em rgba(225, 20, 98, 0.75), -1em 0.5em rgba(111, 202, 220, 0.75); } } @keyframes after { 0% { height: 0.5em; box-shadow: 0.5em 1em rgba(61, 184, 143, 0.75), -0.5em -1em rgba(233, 169, 32, 0.75); } 35% { height: 2.5em; box-shadow: 0.5em 0 rgba(61, 184, 143, 0.75), -0.5em 0 rgba(233, 169, 32, 0.75); } 70% { height: 0.5em; box-shadow: 0.5em -1em rgba(61, 184, 143, 0.75), -0.5em 1em rgba(233, 169, 32, 0.75); } 100% { box-shadow: 0.5em 1em rgba(61, 184, 143, 0.75), -0.5em -1em rgba(233, 169, 32, 0.75); } } /** * attempt to center the whole thing! */ html, body { height: 100%; } .loader { position: absolute; top: calc(50% - 1.25em); left: calc(50% - 1.25em); }
这样就可以直接在组件里面手动调用啦!
调用方法: this.$loading.show(), this.$loading.hide()
因为这个项目暂时规模很小,就只有注册功能,我直接把调用写在axios请求拦截器里面,每次请求和请求结束都会调用loading,这样就不用在页面里面手动调用啦。
总结
以上所述是小编给大家介绍的vue 全局loading组件,希望对大家有所帮助
上一篇: Ruby中Hash的11个问题解答
下一篇: Vue 让元素抖动/摆动起来的实现代码