在使用
element-ui
的過程中,我相信你在使用到類似
this.$message
功能的時候,會覺得這個功能真的非常方便,不用
import
入組件,全局都可以調用。它就是通過
Vue.extend
+
$mount
實現。
擴展實例構造器
Vue.extend
返回的是一個“擴展實例構造器”,也就是一個預設了部分選項的 Vue 實例構造器。剛學的時候對“擴展實例構造器”這一名詞感覺很疑惑,其實它就像構造函數,構造函數中會事先定義好一些屬性,new
出來的對象也就默認有構造函數中的屬性,同理Vue.extend
也是如此,看下例:
1 //DOM 2 <div id="point"></div> 3 4 // 構建一個擴展實例構造器 5 var todoItem = Vue.extend({ 6 template: ` <p v-on:click="wordClick"> {{ text }} </p> `, 7 data() { 8 return { 9 text: 'default word' 10 } 11 }, 12 methods:{ 13 wordClick(){ 14 console.log('click me') 15 } 16 } 17 }) 18 //實例化一個新的對象並綁定到對應的DOM元素上 19 new todoItem({ 20 data() { 21 return { 22 text: 'hello world' 23 } 24 } 25 }).$mount('#point');
todoItem
是一個“擴展實例構造器”,預設了template
,data
,methods
,當new
出一個新的對象的時候,新對象也默認擁有這些模塊,同時也可以替換新的屬性,非常靈活。
封裝toast
插件
一般在項目開發過程中,會新建一個plugins
文件夾放編寫的插件,一個插件對應一個文件夾,文件夾里包含兩個文件,一個js文件和vue文件。
toast.vue
1 <template> 2 <transition name="message"> 3 <div class="toastWrap" v-if="toastShow" v-html="toastVal"></div> 4 </transition> 5 </template> 6 7 <script> 8 export default { 9 name: 'Toast' 10 } 11 </script> 12 13 <style scoped lang="scss"> 14 ... 15 </style>
在該文件中可以事先寫好toast的DOM
結構和對應的樣式
toast.js
1 import Vue from 'vue' 2 import toastComponent from './toast.vue' 3 4 const ToastConstructor = Vue.extend(toastComponent); 5 6 function showToast(toastVal='default',time=1000){ 7 let ToastDOM = new ToastConstructor({ 8 el:document.createElement('div'), 9 data(){ 10 return { 11 toastVal:toastVal, 12 toastShow:false 13 } 14 } 15 }); 16 document.body.appendChild(ToastDOM.$el); 17 ToastDOM.toastShow = true; 18 let timer = setTimeout(res=>{ 19 clearTimeout(timer); 20 ToastDOM.toastShow = false; 21 },time); 22 } 23 24 Vue.prototype.$toast = showToast;
在全局調用
$toast
方法就是觸發了綁定在
Vue
原型上的
showToast
方法,可以將Toast動態插入到body中,而不用像
Component
組件一樣,都要預先
import
引入,相比較起來會方便很多。
App.vue
... mounted() { this.$toast('這是一個tast彈窗',2000) }, ...
至此就是對vue中extend的理解