美文网首页
darkti UI—toast消息提示

darkti UI—toast消息提示

作者: darkTi | 来源:发表于2020-06-23 19:21 被阅读0次

一、创建this.$toast

  • css尽量都不要写进js里面;
    1、 Vue.prototype.$toast = function(){},然后你就可以用this.$toast()
import Vue from 'vue'
Vue.prototype.$toast = function(){
    console.log('toast')
}

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

二、使用Vue的插件功能

  • 动态创建实例,生成一个toast组件,放在body里面,参考知乎文章

    动态创建实例.png
  • 如果你用vue,想append进页面一个元素,那么一定优先append进一个组件,不要直接append进一个div;好处的话,绑定事件会方便很多;

  • this.$el.remove()把元素从body里拿出来;this.$destory()然后自己再毁灭掉;

  • 如果你的props是个对象或数组,那么default值不能直接写成{}[],要写成一个函数,return出来(跟组件的data形式一样)

  • css问题,有时候你观察到高度的不是0,但打印出来是0,一般就是异步的问题(用vm.$nextTick(()=>{})解决);

  • 把toast的height改成min-height后,出现了一个css上的bug,右边那条线高度撑不起来了,所以我们就不得不通过js去操控css,给线加上高度;通过ref来获取toast的高度值;vm.$nextTick(()=>{})意思是回调会在DOM更新之后执行)

this.$nextTick(()=>{
            this.$refs.line.style.height = `${this.$refs.toast.getBoundingClientRect().height}px`
        })
this.$refs.toast.getBoundingClientRect()
getBoundingClientRect.png
  • 高度不定的flex元素,里面的子元素高度定100%是没有用的(最小高度不算高度)

  • 设置位置属性时,上下中间叫middle,左右中间叫center;

  • 最好用indexOf,不用includes(indexOf兼容性更好一些)

三、禁止多个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()
  },

相关文章

  • darkti UI—toast消息提示

    一、创建this.$toast css尽量都不要写进js里面;1、 Vue.prototype.$toast = ...

  • 2020-08-24

    UI组件之弹出组件(Toast) Toast是一个消息提示组件设置显示的位置自定义显示内容(示例:添加一个图片)简...

  • js实现toast消息队列

    依赖Vue element ui实现toast消息队列

  • Android学习日记

    Day 4 Title 消息提示之toast toast用于向用户提示写一些帮助和提示; 特点:1.没有焦点 ...

  • toast提示信息处理

    什么是toast提示信息? toast:Android中的Toast是一种简易的消息提示框。 和Dialog不一样...

  • 『与善仁』Appium基础 — 42.获取toast信息

    1、toast介绍 Android中的toast是一种简易的消息提示框,toast提示框不能被用户点击,会根据所设...

  • 控件 - Toast

    Toast 消息提示框 弹出提示消息,自动消失。 示例代码 ToastActivity.java makeText...

  • 一个实时响应Toast的工具类

    在安卓开发中,如果我们直接使用 来显示Toast消息的话,若用户在当前Toast还未结束时继续触发Toast提示,...

  • 十、Toast详细用法

    Toast是一个非常方便的提示消息框,它会在程序界面显示一个简单的提示信息,具有两个特点,一是Toast提示信息不...

  • 微信小程序 - 9.组件(toast、loading)

    一、toast toast消息提示框,可用在提示一些信息,比如清楚缓存给用户一个友好的提示!或操作一些请求不想让用...

网友评论

      本文标题:darkti UI—toast消息提示

      本文链接:https://www.haomeiwen.com/subject/espkwhtx.html