vue教程之toast弹框全局调用示例详解


Posted in Javascript onAugust 24, 2020

本文实例为大家分享了vue toast弹框全局调用示例,供大家参考,具体内容如下

1.首选新建一个toast.vue模板文件:

<template>
 <transition :name="fadeIn">
 <div class="alertBox" v-show="show">
  <div class="alert-mask" v-show="isShowMask"></div>
  <transition :name="translate">
  <div class="box" :class="position" v-show="show">
   {{text}}
  </div>
  </transition>
 </div>
 </transition>
</template>

<script>
export default {
 data() {
 return {
 }
 },
 props: {
 show: { // 是否显示此toast
  default: false
 },
 text: { // 提醒文字
  default: 'loading'
 },
 position: { // 提醒容器位置
  default: 'center'
 },
 isShowMask: { // 是否显示遮罩层
  default: false
 },
 time: { // 显示时间
  default: 1500
 },
 transition: { // 是否开启动画
  default: true
 }
 },
 mounted() { // 时间控制
 setTimeout(() => {
  this.show = false
 }, this.time)
 },
 computed: {
 translate() { // 根据props,生成相对应的动画
  if (!this.transition) {
  return ''
  } else {
  if (this.position === 'top') {
   return 'translate-top'
  } else if (this.position === 'middle') {
   return 'translate-middle'
  } else if (this.position === 'bottom') {
   return 'translate-bottom'
  }
  }
 },
 fadeIn() { // 同上
  if (!this.transition) {
  return ''
  } else {
  return 'fadeIn'
  }
 }
 }
}
</script>

<style>
 .box{
 position: fixed;
 top: 50%;
 left: 50%;
 width: 100px;
 height: 100px;
 margin-left: -50px;
 margin-top: -50px;
 background: rgba(0,0,0,.5);
 text-align: center;
 line-height: 100px;
 color: #fff;
 font-size: 16px;
 z-index: 5000;
 color: #fff;
 }
 .box.top{
 top: 50px;
 margin-top: 0;
 }
 .box.center{
 top: 50%;
 margin-top: -100px;
 }
 .box.bottom{
 top: auto;
 bottom: 50px;
 margin-top: 0;
 }
 .alert-mask{
 position: fixed;
 left: 0;
 top: 0;
 bottom: 0;
 right: 0;
 background: rgba(0,0,0,.5);
 z-index: 4999;
 }
 .fadeIn-enter-active, .fadeIn-leave-active{
 transition: opacity .3s;
 }
 .fadeIn-enter, .fadeIn-leave-active{
 opacity: 0;
 }
 .translate-top-enter-active, .translate-top-leave-active{
 transition: all 0.3s cubic-bezier(.36,.66,.04,1);
 }
 .translate-top-enter, .translate-top-leave-active{
 transform: translateY(-50%);
 opacity: 0;
 }
 .translate-middle-enter-active, .translate-middle-leave-active{
 transition: all 0.3s cubic-bezier(.36,.66,.04,1);
 }
 .translate-middle-enter, .translate-middle-leave-active{
 transform: translateY(80%);
 opacity: 0;
 }
 .translate-bottom-enter-active, .translate-bottom-leave-active{
 transition: all 0.3s cubic-bezier(.36,.66,.04,1);
 }
 .translate-bottom-enter, .translate-bottom-leave-active{
 transform: translateY(100%);
 opacity: 0;
 }
</style>

2.主逻辑在toast.js里完成:

var Alert = require('./index.vue') // 引入vue模板
var Toast = {} // 定义插件对象
Toast.install = function (Vue, options) { // vue的install方法,用于定义vue插件
 // 如果toast还在,则不再执行
 if(document.getElementsByClassName('alertBox').length){ 
  return
 }
 let toastTpl = Vue.extend(Alert) // 创建vue构造器
 // el:提供一个在页面上已存在的DOM元素作为Vue实例的挂载目标。可以是css选择器,也可以是HTMLElement实例。
 // 在实例挂载之后,可以通过$vm.$el访问。
 // 如果这个选项在实例化时有用到,实例将立即进入编译过程。否则,需要显示调用vm.$mount()手动开启编译(如下)
 // 提供的元素只能作为挂载点。所有的挂载元素会被vue生成的dom替换。因此不能挂载在顶级元素(html, body)上
 // let $vm = new toastTpl({
 // el: document.createElement('div')
 // })
 let $vm = new toastTpl() // 实例化vue实例
 // 此处使用$mount来手动开启编译。用$el来访问元素,并插入到body中
 let tpl = $vm.$mount().$el
 document.body.appendChild(tpl)

 Vue.prototype.$toast = { // 在Vue的原型上添加实例方法,以全局调用
 show(options) { // 控制toast显示的方法
  if (typeof options === 'string') { // 对参数进行判断
  $vm.text = options // 传入props
  }
  else if (typeof options === 'object') {
  Object.assign($vm, options) // 合并参数与实例
  }
  $vm.show = true // 显示toast
 },
 hide() { // 控制toast隐藏的方法
  $vm.show = false
 }
 }
}
export default Toast; // 导出Toast(注意:此处不能用module exports导出,在一个文件中,不能同时使用require方式引入,而用module exports导出,两种方式不能混用)

使用:

在vue项目的主文件中,引入插件,并进行安装:

vue教程之toast弹框全局调用示例详解

这样在项目的任何组件里,都可以使用这个toast的弹窗插件了:

vue教程之toast弹框全局调用示例详解

想要更高级的插件学习源码,请移步vux进行源码学习

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 面向对象思想 附源码
Jul 07 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
Oct 23 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
Nov 27 Javascript
利用进制转换压缩数字函数分享
Jan 02 Javascript
JavaScript阻止浏览器返回按钮的方法
Mar 18 Javascript
全面解析Bootstrap中form、navbar的使用方法
May 30 Javascript
BootStrap便签页的简单应用
Jan 06 Javascript
vue.js中指令Directives详解
Mar 20 Javascript
在Vue中使用echarts的实例代码(3种图)
Jul 10 Javascript
基于JavaScript实现无限加载瀑布流
Jul 21 Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
Jul 22 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
Jul 23 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
Aug 14 #Javascript
jQuery实现手势解锁密码特效
Aug 14 #jQuery
Vue+Element使用富文本编辑器的示例代码
Aug 14 #Javascript
带你快速理解javascript中的事件模型
Aug 14 #Javascript
JS获取子、父、兄节点方法小结
Aug 14 #Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
Aug 14 #Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
Aug 14 #Javascript
You might like
PHP 实现判断用户是否手机访问
2015/01/21 PHP
PIGCMS 如何关闭聊天机器人
2015/02/12 PHP
php身份证号码检查类实例
2015/06/18 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
php实时倒计时功能实现方法详解
2017/02/27 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
javascript 多级checkbox选择效果
2009/08/20 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
十个Python程序员易犯的错误
2015/12/15 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
spark: RDD与DataFrame之间的相互转换方法
2018/06/07 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
python线程的几种创建方式详解
2019/08/29 Python
python-tornado的接口用swagger进行包装的实例
2019/08/29 Python
pytorch实现特殊的Module--Sqeuential三种写法
2020/01/15 Python
中专毕业生的自我鉴定
2013/12/01 职场文书
大学生自荐信
2013/12/11 职场文书
班组长安全工作职责
2014/07/15 职场文书
党委领导班子整改方案
2014/09/30 职场文书
公务员检讨书
2014/11/01 职场文书
慰问信模板
2015/02/14 职场文书
微观世界观后感
2015/06/10 职场文书
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis