vue 实现全局使用的loading组件(使用Vue.extend)

vue 实现全局使用的loading组件(使用Vue.extend)

在开发中,如果项目比较复杂,那么页面加载往往会有一个小空白时间。当然了,页面加载速度这些我们必须要去优化。但若有时候网络不好了什么的,总之免不了会出现白屏。为了不让用户的内心在这段时间内过于寂寞,我们往往需要给页面加上 loading 小圈圈,告诉用户:我们正在努力拽数据呢,亲,稍等哈~~

实现思路

其实,写个loadign页面很简单,关键的是如何让使用起来更简单。

思路一:可能我们一开始最容易想起来的就是,吧loading抽成一个组件,那个页面要用,那个页面引入就好了,然后注册组件,用v-if或者v-show显示隐藏。这没啥毛病,就是感觉麻烦了点,凭什么每个页面都要去引入?这组件用的频率高,列表加载,点击保存,估计我们都会用。

思路二:那既然使用频率高,何不将组件做成全局注册组件?这样就省去了每个组件引用的代码。这比思路一要更进一步了,但是,这样我们就满足了吗?NO! NO! NO! 这不是一个优雅的程序员的风格啊。

假如你和我一样,都不是神马大佬级别人物。如果同样有这种需求,而又一时想不到好办法,咋办?
抄呗。咳咳,说的太直接了点,应该叫借鉴,擅长于从别人的代码里面学习也是一种能力。
使用vue开发的童鞋,相比大部分都使用过element-ui,当然element-ui也有loading组件,你会发现使用时loading,confirm这些组件,都是可以用this访问的,这样调用起来是不是很方便?

点开loading组件源码,我们找到了实现的关键点。其实就是下面这代码

const LoadingConstructor = Vue.extend(loadingVue);


LoadingConstructor.prototype.close = function() {
  if (this.fullscreen) {
    fullscreenLoading = undefined;
  }
  afterLeave(this, _ => {
    const target = this.fullscreen || this.body
      ? document.body
      : this.target;
    removeClass(target, 'el-loading-parent--relative');
    removeClass(target, 'el-loading-parent--hidden');
    if (this.$el && this.$el.parentNode) {
      this.$el.parentNode.removeChild(this.$el);
    }
    this.$destroy();
  }, 300);
  this.visible = false;
};

其实就是,使用vue.extend创建构造器,然后在构造器下挂函数就好了。

官方对vue.extend解释也很简单:使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。data 选项是特例,需要注意 - 在 Vue.extend() 中它必须是函数

好,这就是我们的思路三了。有了思路,我们就可以实现了,这里我们不需要像elemenet-ui那么复杂,简单点。

剩下的就直接上代码了哈。起个名字吧,叫lm-loading。
lm-loading.vue

<template>
  <div class="loadingBox rowCenter" v-if="visible">
    <i class="el-icon-loading font32 gray666"></i>
  </div>
</template>

<script>
export default {
    name: "LmLoading",
}
</script>

入口文件index.js

import Vue from 'vue'
import lmLoading from './lm-loading'
const LmLoadingConstructor=Vue.extend(lmLoading)
let instance
const initInstance = () => {
  instance = new LmLoadingConstructor({
    el: document.createElement('div'),
    data(){
      return {
        visible: false,
      }
    }
  })
}
const LmLoading=function (){
  if (!instance) {
    initInstance()
  }
}
LmLoading.show=function (timeout){
  return new Promise((resolve,reject)=>{
    document.body.appendChild(instance.$el)
    instance.visible = true
    if(typeof timeout==='number'){
      let timeNum=setTimeout(()=>{
        clearTimeout(timeNum)
        instance.visible=false
      },timeout)
    }
    resolve(true)
  })
}
LmLoading.hidden=function (){
  instance.visible =false
}
export default LmLoading

如此,调用也很简单

在main.js里面引入

import LmLoading from 'lm-loading'
Vue.use(LmLoading)
Vue.prototype.$lmLoading=LmLoading

使用

this.$lmLoading.show()

this.$lmLoading.hidden()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容