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 相关文章推荐
Display SQL Server Login Mode
Jun 21 Javascript
JS Array对象入门分析
Oct 30 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
May 31 Javascript
简单了解JavaScript操作XPath的一些基本方法
Jun 03 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
Aug 05 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
Jan 18 jQuery
vue移动端路由切换实例分析
May 14 Javascript
layui form表单提交之后重新加载数据表格的方法
Sep 11 Javascript
微信小程序实现图片压缩
Dec 03 Javascript
vue实现下拉菜单树
Oct 22 Javascript
JS时间戳与日期格式互相转换的简单方法示例
Jan 30 Javascript
vue3使用vue-router的完整步骤记录
Jun 20 Vue.js
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过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
php多任务程序实例解析
2014/07/19 PHP
php实现计数器方法小结
2015/01/05 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
PHP的PDO错误与错误处理
2019/01/27 PHP
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
Javascript 按位与赋值运算符 (&amp;=)使用介绍
2014/02/04 Javascript
jquery实现的美女拼图游戏实例
2015/05/04 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
详解React native fetch遇到的坑
2018/08/30 Javascript
JS添加或删除HTML dom元素的方法实例分析
2019/03/05 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
python 正则式 概述及常用字符
2009/05/07 Python
Python Deque 模块使用详解
2014/07/04 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
2019/01/29 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
2014年教师政治学习材料
2014/06/02 职场文书
护士求职自荐信范文
2015/03/04 职场文书
2015年生产部工作总结范文
2015/05/25 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
Python turtle实现贪吃蛇游戏
2021/06/18 Python
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA