vue 增加loading指令
在开发项目的时候发现为了提高交互上的体验,需要加一个loading效果,为了请求接口数据响应过慢。在没有引用其他ui框架的情况下自己写一个指令。
首先创建文件夹如下:
images文件夹里面就一个随便适合的gif图片,这个可以找ui帮忙解决,或者自己去找找素材。
loading.vue里面的内容
<template> <div v-show="visible" class="loading-wrap"> <div class="loading-box"> <img src="./images/loading.gif" alt=""> </div> </div> </template> <script> export default { name: "loading", data() { return { visible: false } } } </script> <style scoped lang="scss"> .loading-box { position: absolute; left: 50%; top: 40%; height: 60px; width: 60px; margin-left: -30px; z-index: 2000; img { width: 100%; height: 100%; } } </style>
很简单,就一个ui样式,加一个显示隐藏
下面是index.js
import Vue from 'vue' import Loading from './loading.vue' const Mask = Vue.extend(Loading) const toggleLoading = (el, binding) => { if (binding.value) { Vue.nextTick(() => { // 控制loading组件显示 el.instance.visible = true // 插入到目标元素 insertDom(el, el, binding) }) } else { el.instance.visible = false } } const insertDom = (parent, el) => { parent.appendChild(el.mask) } export default { bind: function (el, binding, vnode) { const mask = new Mask({ el: document.createElement('div'), data () {} }) el.instance = mask el.mask = mask.$el el.maskStyle = {} binding.value && toggleLoading(el, binding) }, update: function (el, binding) { if (binding.oldValue !== binding.value) { toggleLoading(el, binding) } }, unbind: function (el, binding) { el.instance && el.instance.$destroy() } }
接下去在想用的地方加一个 v-loading="isLoading" 指令就行, isLoading 是各自页面控制显示隐藏的参数
哦,别忘了在main.js注册一个指令全局
// 注册自定义指令 Object.keys(directives).forEach(key => { Vue.directive(key, directives[key]) })
其实这个指令的方法是参考饿了么里面的loading方法写出来的,还希望有优化的地方请指教。