Vue.extend
屬於 Vue 的全局 API,在實際業務開發中我們很少使用,因為相比常用的 Vue.component
寫法使用 extend
步驟要更加繁瑣一些。但是在一些獨立組件開發場景中,Vue.extend
+ $mount
這對組合是我們需要去關注的。
官方文檔
學習開始之前我們先來看一下官方文檔是怎么描述的。
Vue.extend( options )
-
參數:
{Object} options
-
用法:
使用基礎 Vue 構造器,創建一個“子類”。參數是一個包含組件選項的對象。
data
選項是特例,需要注意 - 在Vue.extend()
中它必須是函數<div id="mount-point"></div>
// 創建構造器 var Profile = Vue.extend({ template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>', data: function () { return { firstName: 'Walter', lastName: 'White', alias: 'Heisenberg' } } }) // 創建 Profile 實例,並掛載到一個元素上。 new Profile().$mount('#mount-point')
結果如下:
<p>Walter White aka Heisenberg</p>
-
參考:組件
可以看到,extend
創建的是 Vue 構造器,而不是我們平時常寫的組件實例,所以不可以通過 new Vue({ components: testExtend })
來直接使用,需要通過 new Profile().$mount('#mount-point')
來掛載到指定的元素上。
為什么使用 extend
在 vue 項目中,我們有了初始化的根實例后,所有頁面基本上都是通過 router 來管理,組件也是通過 import
來進行局部注冊,所以組件的創建我們不需要去關注,相比 extend
要更省心一點點。但是這樣做會有幾個缺點:
- 組件模板都是事先定義好的,如果我要從接口動態渲染組件怎么辦?
- 所有內容都是在
#app
下渲染,注冊組件都是在當前位置渲染。如果我要實現一個類似於window.alert()
提示組件要求像調用 JS 函數一樣調用它,該怎么辦?
這時候,Vue.extend + vm.$mount
組合就派上用場了。
簡單示例
我們照着官方文檔來創建一個示例:
import Vue from 'vue'
const testComponent = Vue.extend({
template: '<div>{{ text }}</div>',
data: function () {
return {
text: 'extend test'
}
}
})
然后我們將它手動渲染:
const extendComponent = new testComponent().$mount()
這時候,我們就將組件渲染掛載到 body
節點上了。
我們可以通過 $el
屬性來訪問 extendComponent
組件實例:
document.body.appendChild(extendComponent.$el)
如果想深入掌握 extend 知識,不妨做一個 alert 組件來實現類似於原生的全局調用。
加油!