vue全局弹窗

效果:在任意页面,不需要引入组件,调用弹窗组件实例方法操作打开关闭 

 

1. 定义

1.1 定义弹窗页面

正常定义即可,需要定义方法show和hide控制组件变量显示及隐藏弹窗。

1.2 弹窗页面同级目录定义得Vue需要得js文件

注意: 搞了单例,调用多少次都是操作一个

import Vue from 'vue'
import FullLoginAd from './index.vue'

// 单例模式
let instance = null

function create (Component, props) {
    const vm = new Vue({
   /* render函数用来生成虚拟dom,接收一个createElement函数(一般称之h函数),
     并返回该函数的执行结果(生成的虚拟dom)。
      h函数接受三个参数,
      1.一个标签名或组件选项对象。
      2.与模板中属性对应的数据对象。
      3.子节点。
     生成的虚拟dom需要经过挂载($mount)才能变成真实dom
   */
    render: h => h(Component, { props })
    // 这里不指定宿主元素,因为直接指定body的话会将已有的内容替换掉。
    }).$mount() 
    /* 通过dom操作追加元素  $el可以获取真实dom */
    document.body.appendChild(vm.$el)
    /* 获取组件实例 */
    const comp = vm.$children[0]
    /* 添加销毁组件的方法 */
    comp.remove = function () {
      document.body.removeChild(vm.$el)
      vm.$destroy()
    }

    return comp
}

export default {
/* install方法实现的需求是 在使用组件时不需要再传入组件模板,只需传入参数,
   因此使用柯里化函数实现。*/
  install(Vue) {
    Vue.prototype.$fullLoginAd = function(options) {
      if (!instance){
        instance = create(FullLoginAd, options)
      }
      return instance
    }
  }
}

// 绑定得组件实例,通过组件实例方法控制,传递方法传参修改data里定义得内容

 

另一种写法:

import FullLoginAd from '@/components/tencentAir/ads/FullLoginAd.vue';

export default {
    install(Vue){
        // 生成一个Vue的子类
        // 同时这个子类也就是组件
        const FullLoginAdConstructor = Vue.extend(FullLoginAd)
        // 生成一个该子类的实例
        const instance = new FullLoginAdConstructor();

        // 将这个实例挂载在创建的div上
        // 并将此div加入全局挂载点内部
        instance.$mount(document.createElement('div'))
        document.body.appendChild(instance.$el)

        // 通过Vue的原型注册一个方法
        // 让所有实例共享这个方法 
        Vue.prototype.$showFullLoginAd = (options) => {
            instance.showFlag = true;
            if (options){
                for (let k in options){
                    instance[k] = options[k]
                }
            }
        }
        Vue.prototype.$hideFullLoginAd = () => {
            instance.showFlag = false;
        }
    }
};

// 操作组件实例属性控制,可控制props里得也可控制data里得

 

2. main.js使用

// 绑定到vue实例上创建登录框
import FullLoginAd from '@/components/tencentAir/ads/FullLoginAd/index.js'
Vue.use(FullLoginAd)

 

3. 使用即可

// 创建实例,拿到实例对象,调用对象方法show

// 可以给show方法传递参数,达到弹窗动态展示数据得目的

this.$fullLoginAd().show()

this.$fullLoginAd().hide()

 

参考文章:

https://www.jianshu.com/p/9423f562c130

 

posted @ 2021-11-23 17:24  zezhou222  阅读(1674)  评论(0编辑  收藏  举报