darkti UI—toast消息提示

2020-06-23  本文已影响0人  darkTi

一、创建this.$toast

import Vue from 'vue'
Vue.prototype.$toast = function(){
    console.log('toast')
}

2、有两个问题,一是直接这样引入Vue好不好;二是在Vue的prototype上定义$toast会不会覆盖掉原有的属性;这两个属于工程问题(就是在工程项目中会实际发生的问题),所以需要使用Vue的插件来解决以上两个问题(可见文档);

二、使用Vue的插件功能

this.$nextTick(()=>{
            this.$refs.line.style.height = `${this.$refs.toast.getBoundingClientRect().height}px`
        })
this.$refs.toast.getBoundingClientRect()
getBoundingClientRect.png

三、禁止多个toast同时出现

1、先重构一下plugin.js里的代码,把创建toast实例写成一个函数,再把toast实例return出来,每次创建实例前都要先检查一下body中是否已有这个实例了,有的话就把它销毁,然后再创建新的实例,这样就做到了禁止多个toast同时出现;
2、其实这里有一个小bug,组件是被销毁了,但是currentToast这个值还在,没有被清空啊!!!所以在销毁toast的时候,触发一个close事件,外面监听一下,一旦监听到close事件了,就把currentToast赋值为null;

//plugin.js
import Toast from './toast.vue'
let currentToast
export default {
    install(Vue,options){ //我没有引Vue,Vue是从哪来的?  通过Vue.use()传来的
        Vue.prototype.$toast = function(message,toastOptions){ //这里括号里的是$toast的属性参数
            if(currentToast){
                currentToast.close()  //组件是被销毁了,但是currentToast这个值还在啊!!!!
            }
            currentToast = createToast(Vue,message,toastOptions,()=>{currentToast = null})  
        }
    }
}
//下面这里传{Vue,message,toastOptions,onClose}或直接写都可以,主要在于你调用时参数的写法会不同,仅此而已
function createToast(Vue,message,toastOptions,onClose){  
    let Constructor = Vue.extend(Toast)
    let toast = new Constructor({
        propsData: toastOptions
    })
    toast.$slots.default = message 
    toast.$mount()  //slot要放在mount之前
    toast.$on('close',onClose)
    document.body.appendChild(toast.$el)
    return toast
}

//toast.vue
 close(){
     this.$el.remove()
     this.$emit('close')
     this.$destroy()
  },
上一篇下一篇

猜你喜欢

热点阅读