vue 動(dòng)態(tài)創(chuàng)建組件的兩種方法
Vue動(dòng)態(tài)創(chuàng)建組件實(shí)例并掛載到body
方式一
import Vue from 'vue'
/**
* @param Component 組件實(shí)例的選項(xiàng)對(duì)象
* @param props 組件實(shí)例中的prop
*/
export function create(Component, props) {
const comp = new (Vue.extend(Component))({ propsData: props }).$mount()
document.body.appendChild(comp.$el)
comp.remove = () => {
document.body.removeChild(comp.$el)
comp.$destroy()
}
return comp
}
方式二
import Vue from 'vue'
export function create(Component, props) {
// 借雞生蛋new Vue({render() {}}),在render中把Component作為根組件
const vm = new Vue({
// h是createElement函數(shù),它可以返回虛擬dom
render(h) {
console.log(h(Component,{ props }));
// 將Component作為根組件渲染出來
// h(標(biāo)簽名稱或組件配置對(duì)象,傳遞屬性、事件等,孩子元素)
return h(Component, { props })
}
}).$mount() // 掛載是為了把虛擬dom變成真實(shí)dom
// 不掛載就沒有真實(shí)dom
// 手動(dòng)追加至body
// 掛載之后$el可以訪問到真實(shí)dom
document.body.appendChild(vm.$el)
console.log(vm.$children);
// 實(shí)例
const comp = vm.$children[0]
// 淘汰機(jī)制
comp.remove = () => {
// 刪除dom
document.body.removeChild(vm.$el)
// 銷毀組件
vm.$destroy()
}
// 返回Component組件實(shí)例
return comp
}
使用
A組件(要?jiǎng)討B(tài)創(chuàng)建的組件)
<template>
<div class="a">
<h2>{{ title }}</h2>
<p>{{ data }}</p>
</div>
</template>
<script>
export default {
props: {
title: {
type: String,
default: "hello world!"
},
message: {
type: String,
default: "o(∩_∩)o 哈哈"
},
duration: {
type: Number,
default: 1000
}
},
data() {
return {
data: "我是a組件",
};
},
created() {
let num = 1
const timer = setInterval(() => {
this.data = num++
}, this.duration)
this.$once("hook: beforeDestroy", () => clearInterval(timer))
}
};
</script>
<style>
.a {
position: fixed;
width: 100%;
top: 16px;
left: 0;
text-align: center;
pointer-events: none;
background-color: #fff;
border: grey 3px solid;
box-sizing: border-box;
}
</style>
B組件(操作動(dòng)態(tài)創(chuàng)建組件的地方)
<template>
<div class="b">
<button @click="createA">創(chuàng)建</button>
</div>
</template>
<script>
import A from "@/components/A.vue"
import { create } from "@/utils/create.js"
export default {
components: {
A,
},
methods: {
createA() {
// 創(chuàng)建A組件,并掛載到body上
create(A, { title: "vue", message: "么么噠😙" })
}
},
};
</script>

以上就是vue 動(dòng)態(tài)創(chuàng)建組件的兩種方法的詳細(xì)內(nèi)容,更多關(guān)于vue 動(dòng)態(tài)創(chuàng)建組件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue.js高德地圖實(shí)現(xiàn)熱點(diǎn)圖代碼實(shí)例
這篇文章主要介紹了vue.js高德地圖實(shí)現(xiàn)熱點(diǎn)圖,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
vue3中reactive和ref的實(shí)現(xiàn)與區(qū)別詳解
reactive和ref都是vue3實(shí)現(xiàn)響應(yīng)式系統(tǒng)的api,他們是如何實(shí)現(xiàn)響應(yīng)式的呢,reactive和ref又有什么區(qū)別呢,下面小編就來和大家詳細(xì)講講,希望對(duì)大家有所幫助2023-10-10
vue $attrs和$listeners的使用與區(qū)別
本文主要介紹了vue $attrs和$listeners的使用與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Nuxt 嵌套路由nuxt-child組件用法(父子頁面組件的傳值)
這篇文章主要介紹了Nuxt 嵌套路由nuxt-child組件用法(父子頁面組件的傳值),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
vue長列表優(yōu)化之虛擬列表實(shí)現(xiàn)過程詳解
前端的業(yè)務(wù)開發(fā)中會(huì)遇到不使用分頁方式來加載長列表的需求,下面這篇文章主要給大家介紹了關(guān)于vue長列表優(yōu)化之虛擬列表實(shí)現(xiàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08

