vue 實(shí)現(xiàn)全局使用的loading組件(使用Vue.extend)

vue 實(shí)現(xiàn)全局使用的loading組件(使用Vue.extend)

在開(kāi)發(fā)中止潘,如果項(xiàng)目比較復(fù)雜,那么頁(yè)面加載往往會(huì)有一個(gè)小空白時(shí)間。當(dāng)然了姑原,頁(yè)面加載速度這些我們必須要去優(yōu)化。但若有時(shí)候網(wǎng)絡(luò)不好了什么的呜舒,總之免不了會(huì)出現(xiàn)白屏锭汛。為了不讓用戶的內(nèi)心在這段時(shí)間內(nèi)過(guò)于寂寞,我們往往需要給頁(yè)面加上 loading 小圈圈,告訴用戶:我們正在努力拽數(shù)據(jù)呢唤殴,親般婆,稍等哈~~

實(shí)現(xiàn)思路

其實(shí),寫(xiě)個(gè)loadign頁(yè)面很簡(jiǎn)單朵逝,關(guān)鍵的是如何讓使用起來(lái)更簡(jiǎn)單蔚袍。

思路一:可能我們一開(kāi)始最容易想起來(lái)的就是,吧loading抽成一個(gè)組件配名,那個(gè)頁(yè)面要用啤咽,那個(gè)頁(yè)面引入就好了,然后注冊(cè)組件渠脉,用v-if或者v-show顯示隱藏宇整。這沒(méi)啥毛病,就是感覺(jué)麻煩了點(diǎn)芋膘,憑什么每個(gè)頁(yè)面都要去引入鳞青?這組件用的頻率高,列表加載索赏,點(diǎn)擊保存盼玄,估計(jì)我們都會(huì)用。

思路二:那既然使用頻率高潜腻,何不將組件做成全局注冊(cè)組件埃儿?這樣就省去了每個(gè)組件引用的代碼。這比思路一要更進(jìn)一步了融涣,但是童番,這樣我們就滿足了嗎?NO! NO! NO! 這不是一個(gè)優(yōu)雅的程序員的風(fēng)格啊威鹿。

假如你和我一樣剃斧,都不是神馬大佬級(jí)別人物。如果同樣有這種需求忽你,而又一時(shí)想不到好辦法幼东,咋辦?
抄唄科雳「罚咳咳,說(shuō)的太直接了點(diǎn)糟秘,應(yīng)該叫借鑒简逮,擅長(zhǎng)于從別人的代碼里面學(xué)習(xí)也是一種能力。
使用vue開(kāi)發(fā)的童鞋尿赚,相比大部分都使用過(guò)element-ui散庶,當(dāng)然element-ui也有l(wèi)oading組件蕉堰,你會(huì)發(fā)現(xiàn)使用時(shí)loading,confirm這些組件悲龟,都是可以用this訪問(wèn)的屋讶,這樣調(diào)用起來(lái)是不是很方便?

點(diǎn)開(kāi)loading組件源碼须教,我們找到了實(shí)現(xiàn)的關(guān)鍵點(diǎn)丑婿。其實(shí)就是下面這代碼

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;
};

其實(shí)就是,使用vue.extend創(chuàng)建構(gòu)造器没卸,然后在構(gòu)造器下掛函數(shù)就好了羹奉。

官方對(duì)vue.extend解釋也很簡(jiǎn)單:使用基礎(chǔ) Vue 構(gòu)造器,創(chuàng)建一個(gè)“子類”约计。參數(shù)是一個(gè)包含組件選項(xiàng)的對(duì)象诀拭。data 選項(xiàng)是特例,需要注意 - 在 Vue.extend() 中它必須是函數(shù)

好煤蚌,這就是我們的思路三了耕挨。有了思路,我們就可以實(shí)現(xiàn)了尉桩,這里我們不需要像elemenet-ui那么復(fù)雜筒占,簡(jiǎn)單點(diǎn)。

剩下的就直接上代碼了哈蜘犁。起個(gè)名字吧翰苫,叫l(wèi)m-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

如此这橙,調(diào)用也很簡(jiǎn)單

在main.js里面引入

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

使用

this.$lmLoading.show()

this.$lmLoading.hidden()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奏窑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子屈扎,更是在濱河造成了極大的恐慌埃唯,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹰晨,死亡現(xiàn)場(chǎng)離奇詭異墨叛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)模蜡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)漠趁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人哩牍,你說(shuō)我怎么就攤上這事棚潦×钇” “怎么了膝昆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵丸边,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我荚孵,道長(zhǎng)妹窖,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任收叶,我火速辦了婚禮骄呼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘判没。我一直安慰自己蜓萄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布澄峰。 她就那樣靜靜地躺著嫉沽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俏竞。 梳的紋絲不亂的頭發(fā)上绸硕,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音魂毁,去河邊找鬼玻佩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛席楚,可吹牛的內(nèi)容都是我干的咬崔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼烦秩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼刁赦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起闻镶,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤甚脉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后铆农,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體牺氨,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年墩剖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猴凹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岭皂,死狀恐怖郊霎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爷绘,我是刑警寧澤书劝,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布进倍,位于F島的核電站,受9級(jí)特大地震影響购对,放射性物質(zhì)發(fā)生泄漏猾昆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一骡苞、第九天 我趴在偏房一處隱蔽的房頂上張望垂蜗。 院中可真熱鬧,春花似錦解幽、人聲如沸贴见。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蝇刀。三九已至,卻和暖如春徘溢,著一層夾襖步出監(jiān)牢的瞬間吞琐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工然爆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留站粟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓曾雕,卻偏偏與公主長(zhǎng)得像奴烙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剖张,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容