vue3兼容的插件多吗(关于vue3编写挂载DOM的插件问题)
类别:编程学习 浏览量:817
时间:2021-10-06 01:24:46 vue3兼容的插件多吗
关于vue3编写挂载DOM的插件问题vue3 跟 vue2 相比,多了一个 app 的概念,vue3 项目的创建也变成了
// 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创建一个插件:
export default function install (Vue) { let app = Vue.extend({ render (h) { return h('li', { style: { display: this.isShow ? 'flex' : 'none' } }) } }) let appDom = new app({ el: document.createElement('li'), 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创建一个插件:
import { createApp, h } from 'vue' export default function install (App) { let app = createApp({ data() { return { isShow: false, } }, render() { return h('li', { style: { display: this.isShow ? 'flex' : 'none' } }) } }) const vNodeDom = document.createElement('li') 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 } }
对比可以发现, vue3 的 DOM挂载方式是新创建一个 app 然后调用 mount() 方法插入到页面中。
全局方法的挂载方式也从 vue2 的 Vue.prototype 到 vue3 的 App.config.globalProperties。
除此之外,vue3 的插件如果用 createApp 来创建新的DOM结构插入到页面的话,与 main.js 中创建的 app 是隔绝开来的,这意味着 main.js 中 use 的组件和公共方法在 这个插件中无法使用。
// 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('li') document.body.appendChild(vNodeDom) app.mount(vNodeDom) }
上面的例子中,el-button 是无法正常显示的,控制台会报错:
[Vue warn]: Failed to resolve component: el-button
所以,如果既想要新建DOM,又要使用main.js全局注册的组件和方法,那就不能用 createApp,
在请教了 vue3 的开发大佬后,有了以下方案:(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('li') 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 } }
这次没有创建新的 app,而是通过给 vNode 复制原来 app 的 context,从而达到组件和公共方法共用,
新创建的插件属性和方法通过 vNode.component.proxy 来访问。
el-button 也正确的解析出来了
到此这篇关于vue3如何编写挂载DOM的插件的文章就介绍到这了,更多相关vue挂载dom插件内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
您可能感兴趣
- vue如何导入excel(Vue实现导入Excel功能步骤详解)
- vue中什么时候需要set属性(Vue.set和this.$set使用和区别)
- vue怎么实现预览与放大(Vue实现牌面翻转效果)
- vue慢动作怎么操作(vue开发之moment的介绍与使用)
- vue实现pc聊天页面(vue实现web在线聊天功能)
- vue pdf预览插件(Vue-pdf实现在线预览PDF文件)
- 详解Vue3中Teleport的使用(详解Vue3中Teleport的使用)
- vue前端搜索功能如何实现(使用Vue3+Vant组件实现App搜索历史记录功能示例代码)
- vue实现双向绑定原理(vue实现双向数据绑定)
- vue时间转换(vue如何动态实时的显示时间浅析)
- vue左右滑动切换(vue实现界面滑动效果)
- vue如何excel表格上传功能(Vue + iView实现Excel上传功能的完整代码)
- vueelementui三级菜单(vue+element ui实现锚点定位)
- vue如何加速(vue函数防抖与节流的正确使用方法)
- vue怎么配置到idea(idea编译器vue缩进报错问题场景分析)
- vue浏览pdf文件(如何在vue中使用pdfjs预览pdf文件)
- 鱿鱼炒蒜苔不是黑暗料理,这样做清香扑鼻,鲜美脆嫩,开胃又下饭(鱿鱼炒蒜苔不是黑暗料理)
- 蒜苔炒鱿鱼(蒜苔炒鱿鱼)
- 远离 五毛食品 洛阳80后妈妈发明的 飞行棋 成校园爆款 玩具(远离五毛食品)
- 失传的古代飞行棋游戏 六博(失传的古代飞行棋游戏)
- 感冒要吃什么药(猫咪感冒要吃什么药)
- 下雪会怎样(下雪怎样画)
热门推荐
- 使用NuGet管理项目的DLL
- vue项目步骤(Vue项目中常用的实用技巧汇总)
- docker容器映射到宿主机器(在宿主机上执行docker容器内部的shell或程序方式)
- dockerpush被拒绝(docker pull拉取超时的解决方案)
- laravel图文分离(Laravel 5.4前后台分离,通过不同的二级域名访问方法)
- js回调函数原理(关于JavaScript回调函数的深入理解)
- python中if条件语句如何使用(Python中如何使用if语句处理列表实例代码)
- dedecms搜索功能怎么设置详细(dedecms pagelist标签修改方法分享)
- 如何实现让dede三级栏目数据调用(dede调取三级栏目名及栏目下的内容列表的方法)
- python如何抓取公众号文章(python爬取微信公众号文章的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9