溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue.extend 編程式插入組件的實現

發(fā)布時間:2020-10-17 17:10:46 來源:腳本之家 閱讀:234 作者:三只萌新 欄目:web開發(fā)

前言

日常中我們要使用一個彈框組件的方式通常是先通過Vue.component 全局或是 component 局部注冊后,然后在模版中使用。接下來我們嘗試編程式的使用組件。

實現

其實步驟很簡單

  1. 通過 Vue.extend() 創(chuàng)建構造器
  2. 通過 Vue.$mount() 掛載到目標元素上
  3. 目標實現一個 alert 彈框,確認和取消功能如下圖

Vue.extend 編程式插入組件的實現

document.createElement

其實想要插入一個元素,通過 document.createElement 就可以實現,并非一定需要上面兩步,但是涉及到組件的復雜度、樣式設置、可維護性所以使用創(chuàng)建構造器的方式比較可行。

Vue.extend()

首先來定義這個彈框的結構和樣式,就是正常的寫組件即可

<template>
 <div class="grid">
   <h2 class="head">這里是標題</h2>
   <div @click="close">{{ cancelText }}</div>
   <div @click="onSureClick">{{ sureText }}</div>
 </div>
</template>
<script>
export default {
 props:{
  close:{
   type:Function,
   default:()=>{}
  },
  cancelText:{
   type:String,
   default:'取消'
  },
  sureText:{
   type:String,
   default:'確定'
  }
 },
 methods:{
  onSureClick(){
   // 其他邏輯
   this.close()
  }
 }
};
</script>

將創(chuàng)建構造器和掛載到目標元素上的邏輯抽離出來,多處可以復用

export function extendComponents(component,callback){
 const Action = Vue.extend(component)
 const div = document.createElement('div')
 document.body.appendChild(div)
 const ele = new Action({
  propsData:{
   cancelText:'cancel',
   sureText:'sure',
   close:()=>{
    ele.$el.remove()
    callback&&callback()
   }
  }
 }).$mount(div)
}

上面代碼需要注意以下幾點:

  1. Vue.extend 獲得是一個構造函數,可以通過實例化生成一個 Vue 實例
  2. 實例化時可以向這個實例傳入參數,但是需要注意的是 props 的值需要通過 propsData 屬性來傳遞
  3. 得到 Vue 實例后,我們需要通過一個目標元素來掛載它,有人首先會想到掛載到 #app 上,這個掛載的過程是將目標元素的內容全部替換,所以一旦掛載到 #app 上,該元素的所有子元素都會消失被替換
  4. 針對第3點,所以創(chuàng)建了一個 div 元素插入到 body 中,我們將想要掛載的內容替換到這個div上

Vue.extend 和 Vue.component component 的區(qū)別

  1. Vue.component component兩者都是需要先進行組件注冊后,然后在 template 中使用注冊的標簽名來實現組件的使用。Vue.extend 則是編程式的寫法
  2. 關于組件的顯示與否,需要在父組件中傳入一個狀態(tài)來控制 或者 在組件外部用 v-if/v-show 來實現控制,而 Vue.extend 的顯示與否是手動的去做組件的掛載和銷毀。
  3. Vue.component component 在組件中需要使用 slot 等自定義UI時更加靈活,而 Vue.extend 由于沒有 template的使用,沒有slot 都是通過 props 來控制UI,更加局限一些。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI