20《Vue 入門教程》Vue 插件

1. 簡介

本節(jié)我們將介紹 Vue 的插件诵盼。包括什么是插件惠豺、如何使用插件、如何編寫一個簡單的插件风宁。其中洁墙,編寫和使用插件是本節(jié)的重點。本節(jié)我們將帶領(lǐng)大家寫一個簡單的插件示例杀糯,同學(xué)們在學(xué)完本節(jié)后可以嘗試編寫其他的插件來加深學(xué)習(xí)扫俺。

2. 木子解釋

插件通常用來為 Vue 添加全局功能苍苞。插件的功能范圍沒有嚴(yán)格的限制固翰,一般有下面幾種:

  1. 添加全局方法或者屬性。如: vue-custom-element羹呵。
  2. 添加全局資源:指令 / 過濾器 / 過渡等骂际。如 vue-touch
  3. 通過全局混入來添加一些組件選項冈欢。如 vue-router歉铝。
  4. 添加 Vue 實例方法,通過把它們添加到 Vue.prototype 上實現(xiàn)凑耻。
  5. 一個庫太示,提供自己的 API,同時提供上面提到的一個或多個功能香浩。如 vue-router类缤。

Vue 插件是對 Vue 全局功能的擴展,他可以給 Vue 添加全局方法邻吭、屬性餐弱、組件、過濾器、指令等等膏蚓。

3. 使用插件

通過全局方法 Vue.use () 使用插件瓢谢。它需要在你調(diào)用 new Vue () 啟動應(yīng)用之前完成:

Vue.use(MyPlugin)

new Vue({
  // ...組件選項
})
代碼塊12345

也可以傳入一個可選的選項對象:

Vue.use(MyPlugin, { someOption: true })
代碼塊1

Vue.use 會自動阻止多次注冊相同插件,即使多次調(diào)用也只會注冊一次該插件驮瞧。
Vue.js 官方提供的一些插件 (例如 vue-router) 在檢測到 Vue 是可訪問的全局變量時會自動調(diào)用 Vue.use ()氓扛。然而在像 CommonJS 這樣的模塊環(huán)境中,你應(yīng)該始終顯式地調(diào)用 Vue.use ():

// 用 Browserify 或 webpack 提供的 CommonJS 模塊環(huán)境時
var Vue = require('vue')
var VueRouter = require('vue-router')

// 不要忘了調(diào)用此方法
Vue.use(VueRouter)
代碼塊123456

awesome-vue 集合了大量由社區(qū)貢獻(xiàn)的插件和庫论笔。

4. 開發(fā)插件

Vue.js 的插件應(yīng)該暴露一個 install 方法幢尚。這個方法的第一個參數(shù)是 Vue 構(gòu)造器,第二個參數(shù)是一個可選的選項對象:

const MyPlugin = {}

MyPlugin.install = function (Vue, options) {
  // 1. 添加全局方法或?qū)傩?  Vue.myGlobalMethod = function () {
    // 邏輯...
  }

  // 2. 添加全局資源
  Vue.directive('my-directive', {
    bind (el, binding, vnode, oldVnode) {
      // 邏輯...
    }
    ...
  })

  // 3. 注入組件選項
  Vue.mixin({
    created: function () {
      // 邏輯...
    }
    ...
  })

  // 4. 添加實例方法
  Vue.prototype.$myMethod = function (methodOptions) {
    // 邏輯...
  }
}
代碼塊1234567891011121314151617181920212223242526272829

接下來翅楼,我們寫一個具體的插件示例:

實例演示

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <my-button>default</my-button>
    <div class="marigin"></div>
    <my-button type="default">default</my-button>
    <div class="marigin"></div>
    <my-button type="primary">primary</my-button>
    <div class="marigin"></div>
    <my-button type="warning">warning</my-button>
    <div class="marigin"></div>
    <my-button type="success">success</my-button>
  </div>
</body>
<style>
  .marigin{
    margin-top: 10px;
  }
  .button{
    width: 100%;
    height: 34px;
    line-height: 32px;
    outline: none;
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    cursor: pointer;
    
  }
  .button-default {
    background-color: #ffffff;
    color: #333333;
    border: 1px solid #ccc;
  }
  .button-primary {
    background-color: #39f;
    color: #ffffff;
    border: 1px solid #39f;
  }
  .button-warning {
    background-color: #f90;
    color: #ffffff;
    border: 1px solid #f90;
  }
  .button-success {
    background-color: #0c6;
    color: #ffffff;
    border: 1px solid #0c6;
  }
</style>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script type="text/javascript">
  // 定義 MyPlugin
  const MyPlugin = {}
  MyPlugin.install = function(Vue, options) {
    Vue.component('MyButton',{
      template: '<button :class="btnClass"><slot/></button>',
      props: {
        type: {
          type: String,
          default: 'default'
        }
      },
      computed: {
        btnClass() {
          return ["button",`button-${this.type}`]
        }
      }
    })
  }
  // 使用插件 MyPlugin
  Vue.use(MyPlugin)

  var vm = new Vue({
    el: '#app',
    data() {
        return {}
    }
  })
</script>
</html>

"運行案例" 可查看在線運行效果

代碼解釋:
JS 代碼第 3-20 行尉剩,我們定義了插件 MyPlugin,該插件中包含一個全局組件 MyButton毅臊。
JS 代碼第 22 行理茎,通過 Vue.use 使用 MyPlugin。
HTML 代碼第 2管嬉、4皂林、6、8蚯撩、10 行础倍,使用 MyPlugin 插件中的 MyButton 組件。

5. 小結(jié)

本節(jié)胎挎,我們帶大家學(xué)習(xí)了 Vue 插件的使用方式沟启。主要知識點有以下幾點:

  • 通過 Vue.use (“插件名字”) 使用插件。
  • 通過 install 方法開發(fā)插件犹菇。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末德迹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子揭芍,更是在濱河造成了極大的恐慌胳搞,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件称杨,死亡現(xiàn)場離奇詭異肌毅,居然都是意外死亡,警方通過查閱死者的電腦和手機姑原,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門悬而,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人页衙,你說我怎么就攤上這事摊滔∫蹙睿” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵艰躺,是天一觀的道長呻袭。 經(jīng)常有香客問我,道長腺兴,這世上最難降的妖魔是什么左电? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮页响,結(jié)果婚禮上篓足,老公的妹妹穿的比我還像新娘。我一直安慰自己闰蚕,他們只是感情好栈拖,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著没陡,像睡著了一般涩哟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盼玄,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天贴彼,我揣著相機與錄音,去河邊找鬼埃儿。 笑死器仗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的童番。 我是一名探鬼主播精钮,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼妓盲!你這毒婦竟也來了杂拨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤悯衬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后檀夹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筋粗,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年炸渡,在試婚紗的時候發(fā)現(xiàn)自己被綠了娜亿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚌堵,死狀恐怖买决,靈堂內(nèi)的尸體忽然破棺而出沛婴,到底是詐尸還是另有隱情,我是刑警寧澤督赤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布嘁灯,位于F島的核電站,受9級特大地震影響躲舌,放射性物質(zhì)發(fā)生泄漏丑婿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一没卸、第九天 我趴在偏房一處隱蔽的房頂上張望羹奉。 院中可真熱鬧,春花似錦约计、人聲如沸诀拭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炫加。三九已至,卻和暖如春铺然,著一層夾襖步出監(jiān)牢的瞬間俗孝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工魄健, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赋铝,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓沽瘦,卻偏偏與公主長得像革骨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子析恋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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