關(guān)于vue3編寫掛載DOM的插件問題
vue3 跟 vue2 相比,多了一個(gè) app 的概念,vue3 項(xiàng)目的創(chuàng)建也變成了
// main.js
import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
const app = createApp(App)
app.use(ElementPlus) // 使用餓了么框架
app.mount('#app')
所以 Vue.extend 也沒有了。
vue2創(chuàng)建一個(gè)插件:
export default function install (Vue) {
let app = Vue.extend({
render (h) {
return h('div', {
style: {
display: this.isShow ? 'flex' : 'none'
}
})
}
})
let appDom = new app({
el: document.createElement('div'),
data: function () {
return {
isShow: false
}
}
})
function show () {
appDom.isShow = true
}
function hide () {
appDom.isShow = false
}
Vue.prototype.$show = show
Vue.prototype.$hide = hide
document.body.appendChild(appDom.$el)
}
vue3創(chuàng)建一個(gè)插件:
import { createApp, h } from 'vue'
export default function install (App) {
let app = createApp({
data() {
return {
isShow: false,
}
},
render() {
return h('div', {
style: {
display: this.isShow ? 'flex' : 'none'
}
})
}
})
const vNodeDom = document.createElement('div')
document.body.appendChild(vNodeDom)
const vm = app.mount(vNodeDom)
App.config.globalProperties.$show = function () {
vm.isShow = true
}
App.config.globalProperties.$hide = function () {
vm.isShow = false
}
}
對比可以發(fā)現(xiàn), vue3 的 DOM掛載方式是新創(chuàng)建一個(gè) app 然后調(diào)用 mount() 方法插入到頁面中。
全局方法的掛載方式也從 vue2 的 Vue.prototype 到 vue3 的 App.config.globalProperties。
除此之外,vue3 的插件如果用 createApp 來創(chuàng)建新的DOM結(jié)構(gòu)插入到頁面的話,與 main.js 中創(chuàng)建的 app 是隔絕開來的,這意味著 main.js 中 use 的組件和公共方法在 這個(gè)插件中無法使用。
// myCom.vue
<template>
<el-button>按鈕</el-button>
</template>
// myCom.js
import { createApp, h } from 'vue'
import myCom from './myCom.vue'
export default function install (App) {
let app = createApp({
data() {
return {
isShow: false
}
},
render() {
return h(myCom)
}
})
const vNodeDom = document.createElement('div')
document.body.appendChild(vNodeDom)
app.mount(vNodeDom)
}
上面的例子中,el-button 是無法正常顯示的,控制臺會報(bào)錯:
[Vue warn]: Failed to resolve component: el-button
所以,如果既想要新建DOM,又要使用main.js全局注冊的組件和方法,那就不能用 createApp,
在請教了 vue3 的開發(fā)大佬后,有了以下方案:(issues)
import { render, h } from 'vue'
import myCom from './myCom.vue'
export default function install (App) {
let vNode = h({
data() {
return {
isShow: false,
}
},
render() {
return h(myCom)
}
})
const vNodeDom = document.createElement('div')
document.body.appendChild(vNodeDom)
vNode.appContext = App._context
render(vNode, vNodeDom)
App.config.globalProperties.$show = function () {
vNode.component.proxy.isShow = true
}
App.config.globalProperties.$hide = function () {
vNode.component.proxy.isShow = false
}
}
這次沒有創(chuàng)建新的 app,而是通過給 vNode 復(fù)制原來 app 的 context,從而達(dá)到組件和公共方法共用,
新創(chuàng)建的插件屬性和方法通過 vNode.component.proxy 來訪問。
el-button 也正確的解析出來了
到此這篇關(guān)于vue3如何編寫掛載DOM的插件的文章就介紹到這了,更多相關(guān)vue掛載dom插件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue項(xiàng)目使用axios封裝request請求的過程
這篇文章主要介紹了vue項(xiàng)目使用axios封裝request請求,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
Vue實(shí)現(xiàn)點(diǎn)擊箭頭上下移動效果
這篇文章主要介紹了Vue實(shí)現(xiàn)點(diǎn)擊箭頭上下移動效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06

