Vue 插件開發(fā)指南

Vue插件的編寫方法一般有下面幾種:

  1. 添加全局方法或者屬性恰画,如: vue-custom-element

  2. 添加全局資源:指令/過濾器/過渡等展鸡,如 vue-touch

  3. 通過全局 mixin 方法添加一些組件選項,如: vue-router

  4. 添加 Vue 實例方法悼瓮,通過把它們添加到 Vue.prototype 上實現(xiàn)。

  5. 一個庫,提供自己的 API垫卤,同時提供上面提到的一個或多個功能,如 vue-router

Vue.js 的插件應(yīng)當(dāng)有一個公開方法 install 出牧。這個方法的第一個參數(shù)是 Vue 構(gòu)造器穴肘,第二個參數(shù)是一個可選的選項對象

注冊:

export default {
  install (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) {
      // 邏輯...
    }
  }
}

使用:

...
import Vue from 'vue'
import MyPlugin from './plugins/plugins.js'

Vue.use(MyPlugin);
...

Vue.js 的插件應(yīng)當(dāng)有一個公開方法 install。通過全局方法Vue.use()使用插件舔痕,也可以傳入一個選項對象:Vue.use(MyPlugin, { someOption: true })

Vue.use 會自動阻止多次注冊相同插件评抚,屆時只會注冊一次該插件。

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)

1 添加全局方法或?qū)傩?/h2>
export default {
    install(Vue, options) {
        Vue.$myName = '勞卜';
    }
}

2 添加全局資源(指令/過濾器/過渡等)

2.1 自定義指令

除了核心功能默認(rèn)內(nèi)置的指令 (v-model 和 v-show),Vue 也允許注冊自定義指令啸如。

在 Vue2.0 中侍匙,代碼復(fù)用和抽象的主要形式是組件。

在需要對普通 DOM 元素進(jìn)行底層操作叮雳,這時候就會用到自定義指令想暗。

通過自定義指令實現(xiàn)聚焦輸入框
// 注冊一個全局自定義指令 `v-focus`
Vue.directive('focus', {
  // 當(dāng)被綁定的元素插入到 DOM 中時……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})

如果想注冊局部指令,通過directives的選項:

directives: {
  focus: {
    // 指令的定義
    inserted: function (el) {
      el.focus()
    }
  }
}

然后你可以在模板中任何元素上使用新的 v-focus 屬性帘不,如下:

<input v-focus>

鉤子函數(shù)

指令定義對象可以提供如下幾個鉤子函數(shù) (均為可選)

  • bind:只調(diào)用一次说莫,指令第一次綁定到元素時調(diào)用。在這里可以進(jìn)行一次性的初始化設(shè)置寞焙。
  • inserted:被綁定元素插入父節(jié)點時調(diào)用 (僅保證父節(jié)點存在唬滑,但不一定已被插入文檔中)。
  • update:所在組件的 VNode 更新時調(diào)用棺弊,但是可能發(fā)生在其子 VNode 更新之前晶密。指令的值可能發(fā)生了改變,也可能沒有模她。但是你可以通過比較更新前后的值來忽略不必要的模板更新 (詳細(xì)的鉤子函數(shù)參數(shù)見下)稻艰。
  • componentUpdated:指令所在組件的 VNode 及其子 VNode 全部更新后調(diào)用。
  • unbind:只調(diào)用一次侈净,指令與元素解綁時調(diào)用尊勿。

鉤子函數(shù)參數(shù)

除了 el 之外僧凤,其它參數(shù)都應(yīng)該是只讀的,切勿進(jìn)行修改元扔。如果需要在鉤子之間共享數(shù)據(jù)躯保,建議通過元素的 dataset 來進(jìn)行。

  • el:指令所綁定的元素澎语,可以用來直接操作 DOM 途事。
  • binding:一個對象,包含以下屬性:
    • name:指令名擅羞,不包括 v- 前綴尸变。
    • value:指令的綁定值,例如:v-my-directive="1 + 1" 中减俏,綁定值為 2召烂。
    • oldValue:指令綁定的前一個值,僅在 updatecomponentUpdated 鉤子中可用娃承。無論值是否改變都可用奏夫。
    • expression:字符串形式的指令表達(dá)式。例如 v-my-directive="1 + 1" 中历筝,表達(dá)式為 "1 + 1"酗昼。
    • arg:傳給指令的參數(shù),可選漫谷。例如 v-my-directive:foo 中仔雷,參數(shù)為 "foo"蹂析。
    • modifiers:一個包含修飾符的對象舔示。例如:v-my-directive.foo.bar 中,修飾符對象為 { foo: true, bar: true }电抚。
  • vnode:Vue 編譯生成的虛擬節(jié)點惕稻。移步 VNode API 來了解更多詳情。
  • oldVnode:上一個虛擬節(jié)點蝙叛,僅在 updatecomponentUpdated 鉤子中可用俺祠。
2.2 自定義過濾器

在創(chuàng)建 Vue 實例之前全局定義過濾器:

Vue.filter('capitalize', function (value) {
  if (!value) return ''
  value = value.toString()
  return value.charAt(0).toUpperCase() + value.slice(1)
})
new Vue({
  // ...
})

創(chuàng)建本地(作用于局部)過濾器:

filters: {
  capitalize: function (value) {
    if (!value) return ''
    value = value.toString()
    return value.charAt(0).toUpperCase() + value.slice(1)
  }
}

使用:

{{ message | filterA | filterB }}
// filterA 被定義為接收單個參數(shù)的過濾器函數(shù)
// 表達(dá)式 message 的值將作為參數(shù)傳入到函數(shù)中。
// 然后繼續(xù)調(diào)用同樣被定義為接收單個參數(shù)的過濾器函數(shù) filterB
// 將 filterA 的結(jié)果傳遞到 filterB 中借帘。
{{ message | filterA('arg1', arg2) }}
// filterA 被定義為接收三個參數(shù)的過濾器函數(shù)蜘渣。
// 其中 message 的值作為第一個參數(shù)
// 普通字符串 'arg1' 作為第二個參數(shù)
// 表達(dá)式 arg2 的值作為第三個參數(shù)。
<div v-bind:id="rawId | formatId"></div>
// 在 `v-bind` 中
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肺然,一起剝皮案震驚了整個濱河市蔫缸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌际起,老刑警劉巖拾碌,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吐葱,死亡現(xiàn)場離奇詭異,居然都是意外死亡校翔,警方通過查閱死者的電腦和手機弟跑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來防症,“玉大人孟辑,你說我怎么就攤上這事「嫦#” “怎么了扑浸?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長燕偶。 經(jīng)常有香客問我喝噪,道長,這世上最難降的妖魔是什么指么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任酝惧,我火速辦了婚禮,結(jié)果婚禮上伯诬,老公的妹妹穿的比我還像新娘晚唇。我一直安慰自己,他們只是感情好盗似,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布哩陕。 她就那樣靜靜地躺著,像睡著了一般赫舒。 火紅的嫁衣襯著肌膚如雪悍及。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天接癌,我揣著相機與錄音心赶,去河邊找鬼。 笑死缺猛,一個胖子當(dāng)著我的面吹牛缨叫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荔燎,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼耻姥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了有咨?” 一聲冷哼從身側(cè)響起琐簇,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摔吏,沒想到半個月后鸽嫂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纵装,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年据某,在試婚紗的時候發(fā)現(xiàn)自己被綠了橡娄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡癣籽,死狀恐怖挽唉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情筷狼,我是刑警寧澤瓶籽,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站埂材,受9級特大地震影響塑顺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俏险,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一严拒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竖独,春花似錦裤唠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至竞膳,卻和暖如春航瞭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顶猜。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工沧奴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痘括,地道東北人长窄。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像纲菌,于是被迫代替她去往敵國和親挠日。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348