當執行時,發生了什麼?
導讀 |
Vue 提供了一種外掛機制,可以給 Vue 擴充一些屬性,其實這個外掛比較"可笑",什麼也沒做。
|
在使用 ElementUI 元件的時候,通常我們會這麼寫:
import ElementUI from 'element-ui'; Vue.use(ElementUI);
這樣寫完後,在我們自定義的元件中既可以直接使用:
<template> <div>我是素燕</div> </template>
透過本文我們來分析下它是如何實現的。
Vue 提供了一種外掛機制,可以給 Vue 擴充一些屬性,其實這個外掛比較"可笑",什麼也沒做,不信看下原始碼:
Vue 內部只是幫你判斷了下有沒有重複註冊,並呼叫了你傳給它的函式,其實我自已也可以呼叫,反而饒了一圈,可能框架設計有自己的考慮吧。
按官方的說法,外掛可以是一個函式或者是包含install函式的物件。Element-ui 可以一次性把所有的元件引入,也可以引入其中某一個,它內部其實使用的就是外掛機制。我們動手自己實現一下:
目錄結構如下:
SyElement/index.js:
定義了一個外掛,該外掛中透過 Vue 提供的全域性函式 component 在全域性註冊了元件 SyInfo 和 SyMessage,看程式碼:
import SyInfo from './SyInfo/index'; import SyMessage from './SyMessage/index'; import log from './log'; export default { install(Vue, options) { // 全域性註冊元件 SyInfo Vue.component(SyInfo.name, SyInfo); // 全域性註冊元件 SyMessage Vue.component(SyMessage.name, SyMessage); // 給 Vue 新增一個全域性函式,該函式可在所有的元件中使用 Vue.prototype.$loglog = log; } }
由於要支援單元件使用,故每個元件其實也是一個外掛。
import SyMessage from './src/component.vue'; // 提供一個 install 函式 SyMessage.install = function(Vue) { Vue.component(SyMessage.name, SyMessage); } export default SyMessage;
component.vue 就是一個元件的具體實現:
<template> <div class="sy-info"> 剖析element-ui的實現方式 </div> </template> <script> export default { name: 'SyMessage' } </script>
SyMessage 和 SyInfo 的實現一樣。到此便可以和 Element-ui 一樣的方式使用了:
import ElementUI from 'element-ui'; Vue.use(ElementUI);
<template> <div> <sy-info></sy-info> <sy-message></sy-message> </div> </template>
多說一句:有時候,有些業務需求需要在每個元件中使用某個服務,比如資料統計,其實可以在 Vue 全域性中掛載一個函式,這樣在每個元件中即可使用,比如文章提到的 log 就是在全域性掛載的一個函式:
Vue.prototype.$loglog = log;
在所有的元件中既可以這樣使用:
this.$log({ uid: 'suyan' });
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2764762/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 當 Redis 發生高延遲時,到底發生了什麼Redis
- 當執行import vue from ‘vue‘ 或其它import xxx from ‘xxx‘ 時發生了什麼?ImportVue
- go func 時發生了什麼Go
- [譯] 當你建立 Flexbox 佈局時,都發生了什麼?Flex
- 執行一條 SQL 語句,期間發生了什麼?SQL
- 面試官:Java從編譯到執行,發生了什麼?面試Java編譯
- 當你開啟網頁的時候,世界都發生了什麼(1)網頁
- 當主執行緒崩潰而其它執行緒繼續執行時發生什麼(2)(轉)執行緒
- 當主執行緒崩潰而其它執行緒繼續執行時發生什麼(1)(轉)執行緒
- 啟動vue專案時發生了什麼Vue
- 系統為什麼會在執行時當機
- 訪問網際網路時發生了什麼?
- oracle commit的時候究竟發生了什麼OracleMIT
- new Vue發生了什麼Vue
- 當我呼叫了$().append()後,jQuery內部發生了什麼?APPjQuery
- [譯文]請求一個URL時發生了什麼
- K8S學習之當我們部署應用的時候都發生了什麼?K8S
- kubelet 建立 Pod 前發生了什麼?
- 猜猜體育課發生了什麼?
- SAP CDS view自學教程之二:當SAP CDS view被啟用時,背後發生了什麼View
- 當面試官問執行緒池時,你應該知道些什麼?面試執行緒
- 【揭祕】C語言型別轉換時發生了什麼?C語言型別
- Android在橫豎屏切換時到底發生了什麼?Android
- 當我們在說“併發、多執行緒”,說的是什麼?執行緒
- 網頁開啟時都發生了什麼?我被嚇著了網頁
- 看看當前某個使用者執行什麼
- 什麼?一個核同時執行兩個執行緒?執行緒
- 【Django】runserver 0.0.0.0:0 後,究竟發生了什麼DjangoServer
- docker container run 背後發生了什麼?DockerAI
- System.gc 之後到底發生了什麼 ?GC
- 鍵盤敲入 A 字母時,作業系統期間發生了什麼作業系統
- 深入理解 EF Core:EF Core 寫入資料時發生了什麼?
- 深入理解 EF Core:EF Core 讀取資料時發生了什麼?
- 夢想之死:這些遊戲工作室倒閉時發生了什麼遊戲
- 通過瀏覽器訪問一個 PHP 檔案時發生了什麼?瀏覽器PHP
- 當你在瀏覽器輸入一個網址,回車後究竟發生了什麼?瀏覽器
- 這個春節假期,遊戲市場發生了什麼?遊戲
- JS每日一題:new Vue()中發生了什麼?JS每日一題Vue