最近公司有一个新的项目,项目框架是我来负责搭建的,所以果断选择了Vue3.x+ts。vue3.x不同于vue2.x,他们两的插件封装方式完全不一样。由于项目中需要用到自定义提示框,所以想着自己封装一个。vue2.x提供了一个vue.extend的全局方法。那么vue3.x是不是也会提供什么方法呢?果然从vue3.x源码中还是找到了。插件封装的方法,还是分为两步。
1、组件准备
按照vue3.x的组件风格封装一个自定义提示框组件。在props属性中定义好。需要传入的数据流。
1
2
3
4
5
6
7
8
9
10
11
12
|
< template >
< div v-show = "visible" class = "model-container" >
< div class = "custom-confirm" >
< div class = "custom-confirm-header" >{{ title }}</ div >
< div class = "custom-confirm-body" v-html = "content" ></ div >
< div class = "custom-confirm-footer" >
< Button @ click = "handleOk" >{{ okText }}</ Button >
< Button @ click = "handleCancel" >{{ cancelText }}</ Button >
</ div >
</ div >
</ div >
</ template >
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
<script lang= "ts" >
import { defineComponent, watch, reactive, onMounted, onUnmounted, toRefs } from "vue" ;
export default defineComponent({
name: "ElMessage" ,
props: {
title: {
type: String,
default : "" ,
},
content: {
type: String,
default : "" ,
},
okText: {
type: String,
default : "确定" ,
},
cancelText: {
type: String,
default : "取消" ,
},
ok: {
type: Function,
},
cancel: {
type: Function,
},
},
setup(props, context) {
const state = reactive({
visible: false ,
});
function handleCancel() {
state.visible = false ;
props.cancel && props.cancel();
}
function handleOk() {
state.visible = false ;
props.ok && props.ok();
}
return {
...toRefs(state),
handleOk,
handleCancel,
};
},
});
</script>
|
2、插件注册
这个才是插件封装的重点。不过代码量非常少,只有那么核心的几行。主要是调用了vue3.x中的createVNode创建虚拟节点,然后调用render方法将虚拟节点渲染成真实节点。并挂在到真实节点上。本质上就是vue3.x源码中的mount操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import { createVNode, render } from 'vue' ;
import type {App} from "vue" ;
import MessageConstructor from './index.vue'
const body=document.body;
const Message: any= function (options:any){
const modelDom=body.querySelector(`.container_message`)
if (modelDom){
body.removeChild(modelDom)
}
options.visible= true ;
const container = document.createElement( 'div' )
container.className = `container_message`
//创建虚拟节点
const vm = createVNode(
MessageConstructor,
options,
)
//渲染虚拟节点
render(vm, container)
document.body.appendChild(container);
}
export default {
//组件祖册
install(app: App): void {
app.config.globalProperties.$message = Message
}
}
|
插件封装完整地址。源码位置————packages/runtime-core/src/apiCreateApp
中的createAppAPI
函数中的mount
方法。
以上就是vue3.0实现插件封装的详细内容,更多关于vue 插件封装的资料请关注服务器之家其它相关文章!
原文链接:https://juejin.cn/post/6905409280761921543