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的时候可以传入组件的属性,比如datamethods生命周期函数等等,它会和组件内定义的属性结合,而不会直接覆盖该属性。
 
在mian.js中,在vue的原型上添加$MessageTip 方法,将组件赋值给这个方法
import MessageTip from '@/page/message/index.js'
Vue.prototype.$MessageTip = MessageTip

然后就可以在全局中通过this.$MessageTip()来调用,例如我在组件message上调用这个弹窗组件

 

posted @ 2022-04-24 17:22  zien  阅读(2424)  评论(0编辑  收藏  举报