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('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创建一个插件:

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
}
}

对比可以发现, 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('div')
document.body.appendChild(vNodeDom)
app.mount(vNodeDom)
}

上面的例子中,el-button 是无法正常显示的,控制台会报错:

[Vue warn]: Failed to resolve component: el-button

所以,如果既想要新建DOM,又要使用main.js全局注册的组件和方法,那就不能用 createApp,

在请教了 vu3 的开发大佬后,有了以下方案:(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
}
}

这次没有创建新的 app,而是通过给 vNode 复制原来 app 的 context,从而达到组件和公共方法共用,

新创建的插件属性和方法通过 vNode.component.proxy 来访问。

el-button 也正确的解析出来了

vue3如何编写挂载DOM的插件的更多相关文章

  1. 使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins)

    使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins) Note 这一章节的内容是基于 Scott Gonzalez 一篇博客 Building ...

  2. 如何编写一个WebPack的插件原理及实践

    _ 阅读目录 一:webpack插件的基本原理 二:理解 Compiler对象 和 Compilation 对象 三:插件中常用的API 四:编写插件实战 回到顶部 一:webpack插件的基本原理 ...

  3. 编写自己的jquery插件

    如何编写自己的jquery插件 Jquery的插件主要分为三类: .封装对象方法的插件:大部分插件都是封装对象的插件 .封装全局函数的插件:将独立的函数添加到jquery的命名空间之下.Jquery. ...

  4. Viper 微服务框架 编写一个hello world 插件-02

    1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...

  5. vue3代码编写

    vue3代码编写 团队内的vue3已经升级一年,在这一年中vue也在不停的更新,为了最大化组合式api带来的优势,便需要合理规范代码的编写方式- 1.从vue2到vue3 vue2组件采用配置式API ...

  6. jQuery 使用 jQuery UI 部件工厂编写带状态的插件(翻译)

    首先,我们要创建一个progress bar,它只允许我们简单的设置进度值.正如我们接下来将要看到的,我们需要通过调用 jQuery.widget 及其两个参数来实现这一操作,这两个参数分别是:将要创 ...

  7. 编写基于jQuery的插件的方法

    注意:jQuery中有一个extend的方法,这个方法是添加js对象字段的,下面会多次用到 1:添加全局类的方法 常用的ajax就是该类插件,下面要编写一个简单的加法和减法的基于jQuery的方法 $ ...

  8. XML DOM 循环(foreach)读取PHP数据 和 PHP 编写 XML DOM 【转载】

    用 PHP 读取和编写可扩展标记语言(XML)看起来可能有点恐怖.实际上,XML 和它的所有相关技术可能是恐怖的,但是用 PHP 读取和编写 XML 不一定是项恐怖的任务.首先,需要学习一点关于 XM ...

  9. JS编写简单的弹窗插件(含有demo和源码)

    最近项目做完了 事情不是很多,今天正好也在调休,所以趁着这个时间研究了一下简易的JS弹窗功能,当然网上这块插件非常多,本人也没有仔细看网上的插件源码 只是凭着日常使用过的弹窗插件有这么多功能 来实现自 ...

随机推荐

  1. Minecraft类游戏地形生成机制

    目录 前言 生成地形高度 生成生物群落 模拟雨水侵蚀.生成河流(未完) 生成洞穴.裂谷 生成植被 放置树木(Bezier曲线) 生成建筑 生成发展域(元胞自动机模型) 放置建筑(DFS) 连接道路(A ...

  2. 03:进程Queue --- 生产者消费者模型

    1 进程Queue介绍 1 进程间数据隔离,两个进程进行通信,借助于Queue​2 进程间通信:IPC -借助于Queue实现进程间通信    -借助于文件        -借助于数据库    -借助 ...

  3. What is maven?

    Introduction Maven, a Yiddish word meaning accumulator(累加器) of knowledge, began as an attempt to sim ...

  4. 【vim】常用总结

    简介 什么是vim? Linux下两大编辑神器之一 vim Linux/Unix下使用最多的编辑器 vi的改进版 可能是最难上手的编辑器之一 为什么要学习vim? 都21世纪了,为什么还需要学习vim ...

  5. NOIP模拟测试26「嚎叫响彻在贪婪的机房·主仆见证了 Hobo 的离别·征途堆积出友情的永恒」

    题目比较神仙,注意是题目神仙 贪婪暗示贪心,堆积暗示堆优化$\%\%\%\%\%\%\%$ 两个乱搞$+$一个堆优化$dp$ 嚎叫响彻在贪婪的机房 题解 对于一个序列来说只要他们差的$gcd$不为$1 ...

  6. OSPF多区域原理与配置

    OSPF多区域原理与配置 目录 一.OSPF多区域生成 1.1.生成OSPF多区域的原因 二.OSPF的三种通信量 2.1.域内通信量 2.2.域间通信量 2.3.外部通信量 三.OSPF的路由器类型 ...

  7. 使⽤Swagger2构建强⼤的RESTful API⽂档

    使⽤Swagger2构建强⼤的RESTful API⽂档 导语: 由于Spring Boot能够快速开发.便捷部署等特性,相信有很⼤⼀部分Spring Boot的⽤户会⽤来构建RESTful API. ...

  8. 20204107 孙嘉临 《PYTHON程序设计》实验四报告

    课程:<Python程序设计>班级: 2041姓名: 孙嘉临学号: 20204107实验教师:王志强实验日期:2020年6月29日必修/选修: 公选课 ##作为一个轻度游戏玩家,当然是要写 ...

  9. 数据同步Datax与Datax_web的部署以及使用说明

    一.DataX3.0概述 DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.ODPS.HBase.FTP等各种异构数据源之间稳定高 ...

  10. github push pull error port 443: Timed out

    最近github只有开代理才能打开,但是即使能打开,进行push或者pull会经常报类似error port 443: Timed out的错误,网上搜了很久才找到解决办法. 首先要查询当前本机使用的 ...