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('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的插件的更多相关文章
- 使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins)
使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins) Note 这一章节的内容是基于 Scott Gonzalez 一篇博客 Building ...
- 如何编写一个WebPack的插件原理及实践
_ 阅读目录 一:webpack插件的基本原理 二:理解 Compiler对象 和 Compilation 对象 三:插件中常用的API 四:编写插件实战 回到顶部 一:webpack插件的基本原理 ...
- 编写自己的jquery插件
如何编写自己的jquery插件 Jquery的插件主要分为三类: .封装对象方法的插件:大部分插件都是封装对象的插件 .封装全局函数的插件:将独立的函数添加到jquery的命名空间之下.Jquery. ...
- Viper 微服务框架 编写一个hello world 插件-02
1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...
- vue3代码编写
vue3代码编写 团队内的vue3已经升级一年,在这一年中vue也在不停的更新,为了最大化组合式api带来的优势,便需要合理规范代码的编写方式- 1.从vue2到vue3 vue2组件采用配置式API ...
- jQuery 使用 jQuery UI 部件工厂编写带状态的插件(翻译)
首先,我们要创建一个progress bar,它只允许我们简单的设置进度值.正如我们接下来将要看到的,我们需要通过调用 jQuery.widget 及其两个参数来实现这一操作,这两个参数分别是:将要创 ...
- 编写基于jQuery的插件的方法
注意:jQuery中有一个extend的方法,这个方法是添加js对象字段的,下面会多次用到 1:添加全局类的方法 常用的ajax就是该类插件,下面要编写一个简单的加法和减法的基于jQuery的方法 $ ...
- XML DOM 循环(foreach)读取PHP数据 和 PHP 编写 XML DOM 【转载】
用 PHP 读取和编写可扩展标记语言(XML)看起来可能有点恐怖.实际上,XML 和它的所有相关技术可能是恐怖的,但是用 PHP 读取和编写 XML 不一定是项恐怖的任务.首先,需要学习一点关于 XM ...
- JS编写简单的弹窗插件(含有demo和源码)
最近项目做完了 事情不是很多,今天正好也在调休,所以趁着这个时间研究了一下简易的JS弹窗功能,当然网上这块插件非常多,本人也没有仔细看网上的插件源码 只是凭着日常使用过的弹窗插件有这么多功能 来实现自 ...
随机推荐
- JavaFx 创建快捷方式及设置开机启动
原文地址:JavaFx 创建快捷方式及设置开机启动 | Stars-One的杂货小窝 原本是想整个桌面启动器,需要在windows平台上实现开机启动,但我的软件都是jar文件,不是传统的exe文件,也 ...
- fiddler概念及原理
一.什么是fiddler? fiddler是位于客户端与服务器端的HTTP代理,它能够记录客户端与服务器之间所有的HTTP请求,可以针对特定的HTTP请求,分析请求数据,设置断点,调试WEB应用,修改 ...
- NX二次开发-向量乘矩阵的几何意义
函数:UF_MTX3_vec_multiply_t() 或者UF_MTX3_vec_multiply().推荐使用UF_MTX3_vec_multiply_t() 函数说明:将向量按照矩阵进行变换:绝 ...
- 【SQLite】批处理脚本BAT读取SQLite数据
批处理读写SQLite数据库.bat:(编码ANSI) @echo off sqlite3 "F:\improve\SQLite\BAT\Test.db" <"F ...
- 可微渲染 SoftRas 实践
SoftRas 是目前主流三角网格可微渲染器之一. 可微渲染通过计算渲染过程的导数,使得从单张图片学习三维结构逐渐成为现实.可微渲染目前被广泛地应用于三维重建,特别是人体重建.人脸重建和三维属性估计等 ...
- Java安全之反序列化回显研究
Java安全之反序列化回显研究 0x00 前言 续上文反序列化回显与内存马,继续来看看反序列化回显的方式.上篇文中其实是利用中间件中存储的Request 和Response对象来进行回显.但并不止这么 ...
- java 写webservice接口解析xml报文
1 <!--解析xml报文--> 2 <dependency> 3 <groupId>dom4j</groupId> 4 <artifactId& ...
- java入门了解、安装jdk及软件的选择
学习编程,一些必要的dos命令还是需要掌握的. 以下只是列出常用的: cd 目录路径: 进入一个目录 cd .. 进入父目录 dir 查看本目录下的文件和子目录列表 cls 清除屏幕命令 上下键 ...
- 信息熵,交叉熵与KL散度
一.信息熵 若一个离散随机变量 \(X\) 的可能取值为 \(X = \{ x_{1}, x_{2},...,x_{n}\}\),且对应的概率为: \[p(x_{i}) = p(X=x_{i}) \] ...
- Xmanager6 企业版安装
Xmanager6 企业版安装 链接:https://pan.baidu.com/s/1QZOD0iPd4WbVHBVXIbJ-fw 提取码:ebkl 一.安装教程 1.1 下载解压,双击安装exe主 ...