關(guān)于vue3編寫(xiě)掛載DOM的插件問(wèn)題
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 也沒(méi)有了。
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 } }
對(duì)比可以發(fā)現(xiàn), vue3 的 DOM掛載方式是新創(chuàng)建一個(gè) app 然后調(diào)用 mount() 方法插入到頁(yè)面中。
全局方法的掛載方式也從 vue2 的 Vue.prototype 到 vue3 的 App.config.globalProperties。
除此之外,vue3 的插件如果用 createApp 來(lái)創(chuàng)建新的DOM結(jié)構(gòu)插入到頁(yè)面的話,與 main.js 中創(chuàng)建的 app 是隔絕開(kāi)來(lái)的,這意味著 main.js 中 use 的組件和公共方法在 這個(gè)插件中無(wú)法使用。
// 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 是無(wú)法正常顯示的,控制臺(tái)會(huì)報(bào)錯(cuò):
[Vue warn]: Failed to resolve component: el-button
所以,如果既想要新建DOM,又要使用main.js全局注冊(cè)的組件和方法,那就不能用 createApp,
在請(qǐng)教了 vue3 的開(kāi)發(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 } }
這次沒(méi)有創(chuàng)建新的 app,而是通過(guò)給 vNode 復(fù)制原來(lái) app 的 context,從而達(dá)到組件和公共方法共用,
新創(chuàng)建的插件屬性和方法通過(guò) vNode.component.proxy 來(lái)訪問(wèn)。
el-button 也正確的解析出來(lái)了
到此這篇關(guān)于vue3如何編寫(xiě)掛載DOM的插件的文章就介紹到這了,更多相關(guān)vue掛載dom插件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue中如何實(shí)現(xiàn)在線預(yù)覽word文件、excel文件
這篇文章主要介紹了Vue中如何實(shí)現(xiàn)在線預(yù)覽word文件、excel文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07vue3+ts+elementPLus實(shí)現(xiàn)v-preview指令
本文主要介紹了vue3+ts+elementPLus實(shí)現(xiàn)v-preview指令,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05vue+element開(kāi)發(fā)一個(gè)谷歌插件的全過(guò)程
這篇文章主要給大家介紹了關(guān)于vue+element開(kāi)發(fā)一個(gè)谷歌插件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Vue.js組件tree實(shí)現(xiàn)省市多級(jí)聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了Vue.js組件tree實(shí)現(xiàn)省市多級(jí)聯(lián)動(dòng)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-125個(gè)可以加速開(kāi)發(fā)的VueUse函數(shù)庫(kù)(小結(jié))
VueUse為Vue開(kāi)發(fā)人員提供了大量適用于Vue2和Vue3的基本Composition API 實(shí)用程序函數(shù)。具有一定的參考價(jià)值,感興趣的可以了解一下2021-11-11vue中modal傳輸數(shù)據(jù)并刷新部分頁(yè)面數(shù)據(jù)方式
這篇文章主要介紹了vue中modal傳輸數(shù)據(jù)并刷新部分頁(yè)面數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04element-ui 關(guān)于獲取select 的label值方法
今天小編就為大家分享一篇element-ui 關(guān)于獲取select 的label值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08vue 使用餓了么UI仿寫(xiě)teambition的篩選功能
這篇文章主要介紹了vue 如何使用餓了么UI仿寫(xiě)teambition的篩選功能,幫助大家更好的理解和學(xué)習(xí)使用vue框架2021-03-03Vue 如何使用props、emit實(shí)現(xiàn)自定義雙向綁定的實(shí)現(xiàn)
這篇文章主要介紹了Vue 如何使用props、emit實(shí)現(xiàn)自定義雙向綁定的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06