vue实现用函数的方式调用组件
背景
平时项目中用到的消息弹窗提示也是别人封装好的,于是自己也想写一个用函数的方式调用组件的小demo,功能类似于elementUI的this.$message(),用vue2实现
实现
第一步,新建一个vue项目,看一下我的项目目录

在message 的index.vue下写一个弹窗组件
<template>
<div class="box">
<div :class="['box-main ', { active: isShow }]">{{ info }}</div>
</div>
</template>
<script>
export default {
data() {
return {
info: "",
isShow: false,
};
},
mounted() {
setTimeout(() => {
this.isShow = true;
}, 2000);
},
methods: {},
};
</script>
<style scoped>
.box {
width: 100%;
height: 100%;
position: relative;
}
.box-main {
width: 150px;
min-height: 50px;
background: #ccc;
text-align: center;
line-height: 50px;
border-radius: 10px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.active {
transition: all 1s;
opacity: 0;
}
</style>
在message 的index.js 写下如下代码
import Vue from 'vue' import Message from './index.vue' let MessageConstructor = Vue.extend(Message) let instance const MessageTip = function(options = {}) { instance = new MessageConstructor({ data: options }) document.body.appendChild(instance.$mount().$el) //this.$el拿到组件实际上的dom,把他挂载到body上 setTimeout(() => { document.body.removeChild(instance.$mount().$el) }, 3000); //3秒之后自动移除dom组件 } export default MessageTip
通过Vue.extend来创建一个Vue的子类,传入一个组件对象,然后通过new来创建组件实例,new的时候可以传入组件的属性,比如data、methods、生命周期函数等等,它会和组件内定义的属性结合,而不会直接覆盖该属性。
在mian.js中,在vue的原型上添加$MessageTip 方法,将组件赋值给这个方法
import MessageTip from '@/page/message/index.js'
Vue.prototype.$MessageTip = MessageTip
然后就可以在全局中通过this.$MessageTip()来调用,例如我在组件message上调用这个弹窗组件


浙公网安备 33010602011771号