1. 程式人生 > >自己動手寫一個Vue外掛(MD.7)

自己動手寫一個Vue外掛(MD.7)

造不完的輪子,封不完的外掛。網上什麼都有,但是有那找的功夫,自己都寫完了。漫島仍然在向前推進,只是你們看不到最新的更新內容了,剩餘的不會展示,等以後上線了再去看把。

講一下如何寫一個的Vue外掛,(以一個極其簡單的loading效果為例),會了這個其他不愁。
第一步,在components目錄建一個Loader.vue檔案用來當做我們的loading模版,簡單寫了下(我用的less)。

<!--載入提示-->
<style scoped lang='less'>
    .loader {
        position: fixed;
        top
: 0
; bottom: 0; left: 0; right: 0; background: rgba(0, 0, 0, .4); z-index: 8; }
.loader-modal { position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin: auto; width: 120px; height: 68px; background-color
: #fff
; z-index: 9; border-radius: 5px; .load-icon { display: block; margin: 5px auto; }
p { text-align: center; color: #333; } }
</style> <template> <transition name='fade' v-if="showLoader">
<div class="loader"> <div class="loader-modal"> <!--這裡是一個載入的小圖示--> <img src="../assets/icon-heart.png" class="load-icon" /> <p>
{{tips}}</p> </div> </div> </transition> </template> <script> export default { name: "LoaderTepmlate", data() { return { showLoader: false } }, methods: { hide() { this.showLoader = false } } } </script>

嗯,就是這麼簡單的一個模版,我們只控制傳進來的文字說明。
接下來就在main.js裡面開搞了,說白了就是利用vue.extend()來建立一個loader例項,再掛載在當前的頁面。
程式碼如下:

import LoaderTepmlate from '@/components/Loader.vue'

let loader={
    install:null
}

loader.install=function(Vue,options){
    //設定全域性作用域方便給其增加自定義方法
    let myLoader;
    Vue.prototype.$loader=function(options){
        if(myLoader) return;
        if(options==undefined){
            options={
                showLoader:true,
                tips:"預設提示"
            }
        }else{
            options.showLoader=true;
        }

        var Loader=Vue.extend(LoaderTepmlate);
        //建立一個loader例項
        myLoader=new Loader({
            data:options
        }).$mount();
        //掛載到頁面 
        document.querySelector("body").appendChild(myLoader.$el);
    }
    //給$loader增加一個手動呼叫的hide方法,這個才是亮點所在,有一天你會明白的。
    Vue.prototype.$loader.hide=function(options){
        myLoader.hide();
    }

}

Vue.use(loader);

在任意頁面呼叫this.$loader()就可以喚醒載入提示了,記得傳參,手動關閉的方法呼叫this.$loader.hide()即可 ,或者你自己再加個關閉時間引數,我之所以加hide是為了演示如何給外掛追加手動操作的方法,具體呼叫樣例如下:

let vm=this;
this.$loader({
    tips: '載入中...'
});

setTimeout(vm=>{
    this.$loader.hide();
},2000)

好了,要睡覺了,還剩72天開發時間用來上線漫島,實際工作時間只有52個下班的夜晚,任務很重,但是從來不會放棄的。這一次,不會再半途而廢了。