Vue 提供的 API 很多,本篇筆記整理了一些常用的 API 用法,應該算得上實用。
Vue.extend() 及 extends
當數個元件的內容很相近、只有少部分不同時,可以使用 Vue.extend() 建立重複的部分,並在元件中搭配使用 extends 特性來取用 Vue.extend() 的內容。
首先宣告一個 Vue.extend() 方法,參數為一個物件。
1 | var newExtend = Vue.extend({ |
接著在元件裡面寫入各自不同的內容,並且要新增一個 extends 特性,對應的值為 Vue.extend() 的變數。
1 | var childOne = { |
當元件使用 extends 來擴充內容時,若在元件中有新增不同的資料或函式,則 Vue.extend() 的內容與元件中的內容都會存在;若在元件中宣告與 Vue.extend() 相同名稱的資料或函式,則在 Vue.extend() 的內容會被覆寫掉。
參照:Vue 學習筆記-讓你 30 天掌握 Vue-Day 18 : Vue extend
Filter 自訂畫面資料呈現格式
局部:只限個別元件使用
在特定元件內想要套用特定資料格式時,使用局部的 filters 特性。
在雙花括號裡的資料後面,用一個 | 隔開,後面加上自訂的 filters 名稱。filters 可以重複使用,一個元素上也可以套用多個 filters。
1 | // 元件模板 |
回到元件,在 data 同層加上 filters 特性,filters 的值為物件型別,裡面的特性就是剛剛在模板中自訂的 filters 名稱,且它會對應一個函式,該函式要回傳「資料轉化為特定格式後的值」。
以下以「將數字加上千分號」為例。
1 | // 局部註冊的元件 |
一個資料上可以加上多個 filters,只需要重複進行以上步驟即可。
全域:所有元件與根實例共用
如果所有元件及根實例都想要使用同樣的資料格式時,使用 Vue.filter()。同樣的 filters 如果在全域有設定了,元件內就不用再設定。
1 | // 結構 |
$set() 動態寫入資料
向響應式物件中添加一個特性,並確保該新特性同樣是響應式的,並觸發 View 更新。它必須用於向響應式物件上添加新特性,因為 Vue 無法檢測到普通的添加特性。—— Vue 官方文件
有時候我們沒辦法預先定義好資料內容,尤其是需要從 AJAX 抓資料的時候。如果要事後補資料到元件的 data 內且被 Vue 的 setter、getter 監控的話,就要使用 this.$set() 語法。
$set() 有三個參數,第一個是資料要存放的物件(例如 this.data),第二個是資料在存放物件中對應的特性,第三個是要寫入的資料內容。
注意,this.$set() 要寫在元件的 methods 裡面。
1 | // 元件 |
this.$set 等同於 Vue.set 嗎?

mixins 混合其他的元件內容
先宣告一個變數,把多個元件會共用的程式碼以物件的形式存放在該變數裡。
1 | // 宣告 mixins 內容 |
在需要使用共用程式碼的元件中,新增 mixins 特性,mixins 的值要以陣列的方式呈現,在該陣列中放入剛剛宣告的變數。
1 | // 元件 |
mixins 和 extends 的差異
mixins 和 extends 兩者都有擴展的作用,只差在 mixins 是陣列,因此可以將不同元件內容分成多個物件後,在需要的元件內使用多個 mixins;而 extends 用於擴展單個元件。
當有相同模板要重複使用的時候透過 extend 去實現,而有零散功能需要套用到不同的模板上的時候,則透過 mixin 去達成。
Directive 開發互動 UI
基本語法結構為:Vue.directive('自訂名稱', {鉤子函式})。然後在要使用 directive 的 HTML 元素上,加上 v-自訂名稱。
directive 有自己的生命週期,且有 el、binding、vnode 和 oldVnode 等參數可以帶入鉤子函式。在特定生命週期要執行的任務,要寫在鉤子函式內。
至於總共有哪些鉤子函式,請參閱官方文件。
鉤子函式的參數
el:代表選取的 DOM,跟使用querySelector效果一樣binding:一個物件,裡面包含了directive自帶的特性vnode:Vue 的虛擬節點
參照:官方文件-自定義指令
範例:製作表單驗證器
假設我們已經有一個現成的 <input> 了,接著宣告一個 directive,先幫這個 <input> 加上 BS 表單樣式。
1 | Vue.directive('validation', { |
在 directive 中加入 update() 鉤子,當表單有資料變動時就會觸發。上網查一下驗證 email 格式的正規式,並判斷使用者輸入的值是否符合格式。是的話就加上通過驗證的 class,不是的話就加上未通過的 class。
1 | Vue.directive('validation', { |
表單驗證,完成~
用自訂指令傳入資料
v-directive 可以傳入物件,冒號左邊是屬性,右邊是屬性對應的值。
上一段範例中,.form-control 是寫在 directive 中,但其實它可以用這個方式動態傳入 className。
1 | v-validation="{ className: 'form-control' }" |
接著鉤子函式的 binding 參數就會接收到透過 v-validation 傳入的值(存放在 binding 物件中的 value 特性裡)。
以這邊的例子來說,就是在 binding.value 中可以找到 className: 'form-control'。然後我們再把它指定給 el.className,如此一來 DOM 就會被加上 .form-control。
1 | Vue.directive('validation', { |
不知道 v-model 對應的 data 特性時
首先,我們要做的是找出 DOM 所綁定的 v-model 對應哪個 data 特性。關於 Vue 的指令會放在 vnode.data.directives 裡面,而 v-model 的名稱則是放在 vnode.data.directives[i].expression。
1 | // 以下內容是寫在 bind() 裡 |
取得 v-model 對應的特性後,可以在 vnode.context 找到該特性的值。
1 | var value = vnode.context[currentModel]; |
使用外部載入套件
BootstrapVue 是一個結合 Bootstrap 及 Vue.js 的套件(官網),可以用 CDN 的方式載入,也可以用 Webpack 載入。
如果使用 Vue Cli 就要使用 Webpack 載入方式:
1 | // CLI 版本請加入以下套用 BootstrapVue |