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 相关文章推荐
ExtJs之带图片的下拉列表框插件
Mar 04 Javascript
javscript对象原型的一些看法
Sep 19 Javascript
无闪烁更新网页内容JS实现
Dec 19 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
Aug 25 Javascript
jQuery+ajax实现局部刷新的两种方法
Jun 08 jQuery
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
May 14 Javascript
vue中element 上传功能的实现思路
Jul 06 Javascript
小程序实现列表删除功能
Oct 30 Javascript
JavaScript中工厂函数与构造函数示例详解
May 06 Javascript
tweenjs缓动算法的使用实例分析
Aug 26 Javascript
layui监听工具栏的实例(操作列表按钮)
Sep 10 Javascript
Vue computed 计算属性代码实例
Apr 22 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中exec函数和shell_exec函数的区别
2014/08/20 PHP
php中in_array函数用法探究
2014/11/25 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
php自动提交表单的方法(基于fsockopen与curl)
2016/05/09 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
jquery插件jquery倒计时插件分享
2013/12/27 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
JS apply用法总结和使用场景实例分析
2020/03/14 Javascript
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
Python抓取京东图书评论数据
2014/08/31 Python
python下载文件时显示下载进度的方法
2015/04/02 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
python之信息加密题目详解
2019/06/26 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
tensorflow 获取checkpoint中的变量列表实例
2020/02/11 Python
Python接口测试get请求过程详解
2020/02/28 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
Python wordcloud库安装方法总结
2020/12/31 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
文言文形式的学生求职信
2013/12/03 职场文书
英语国培研修感言
2014/02/13 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
和解协议书
2014/04/16 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
2015年个人工作总结报告
2015/04/25 职场文书