Vue自定义全局Toast和Loading的实例详解


Posted in Javascript onApril 18, 2019

如果我们的Vue项目中没有用到任何UI框架的话,为了更好的用户体验,肯定会用到loading和toast。那么我们就自定义这两个组件吧。

1、Toast组件

首先,在common下新建global文件夹,存放我们的toast.vue和toast.js两个文件(当然文件的具体位置你可以自行安排)。

(1). toast.vue

<template lang="html">
 <div v-if="isShowToast" class="toast-container" @touchmove.prevent>
  <!-- 这里content为双花括号 -->
  <span class="loading-txt">{content}</span>
 </div>
</template>

<script>
export default {
 data () {
  return {
   isShowToast: true,
   content: ''
  }
 }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.toast-container {
 position: fixed;
 top: 0;
 left: 0;
 width: 100%;
 height: 100%;
 background: rgba(255, 255, 255, 0.1);
}
.toast-msg {
 position: absolute;
 top: 50%;
 left: 50%;
 transform: translate(-50%, -50%);
 width: 60%;
 padding: 35px;
 border-radius: 10px;
 font-size: 28px;
 line-height: 36px;
 background: #eee;
 color: #666;
}
</style>

(2). toast.js

import Vue from 'Vue'
import ToastComponent from './Toast.vue'

const Toast = {}
let showToast = false // 存储loading显示状态
let toastNode = null // 存储loading节点元素
const ToastConstructor = Vue.extend(ToastComponent)

Toast.install = function (Vue, options) {
 // 参数
 var opt = {
  duration: '1200'
 }
 for (var property in options) {
  opt[property] = options[property]
 }
 Vue.prototype.$toast = function (tips, type) {
  if (type === 'hide') {
   toastNode.isShowToast = showToast = false
  } else {
   if (showToast) {
    // 如果toast还在,则不再执行
    return
   }
   toastNode = new ToastConstructor({
    data: {
     isShowToast: showToast,
     content: tips
    }
   })
   toastNode.$mount() // 挂在实例,为了获取下面的toastNode.$el
   document.body.appendChild(toastNode.$el)
   toastNode.isShowToast = showToast = true
   setTimeout(function () {
    toastNode.isShowToast = showToast = false
   }, opt.duration)
  }
 };

 ['show', 'hide'].forEach(function (type) {
  Vue.prototype.$toast[type] = function (tips) {
   return Vue.prototype.$toast(tips, type)
  }
 })
}

export default Toast

然后,我们需要把写好的组件在 /src/main.js 中引用一下。

import Toast from './components/common/global/toast'
Vue.use(Toast)

最后,怎么使用呢?只需在要用的地方this.$toast.show('hello world')

2、Loading组件

loading组件只需要照着toast组件搬过来,稍微改下就可以了。

首先,在common下新建global文件夹,存放我们的loading.vue和loading.js两个文件。

(1). loading.vue

<template lang="html">
 <div v-if="isShowLoading" class="loading-container">
  <div class="loading-box">
   <img class="loading-img" :src="require('../../../assets/images/loading.png')">
   <!-- 这里content为双花括号 -->
   <span class="loading-txt">{content}</span>
  </div>
 </div>
</template>

<script>
export default {
 data () {
  return {
   isShowLoading: false,
   content: ''
  }
 }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.loading-container {
 display: flex;
 justify-content: center;
 align-items: center;
 position: fixed;
 top: 0;
 left: 0;
 width: 100%;
 height: 100%;
 background: rgba(0, 0, 0, 0);
 z-index: 1000;
}
.loading-box {
 display: flex;
 flex-direction: column;
 justify-content: center;
 align-items: center;
 width: 150px;
 height: 150px;
 border-radius: 10px;
 background: #e5e5e5;
}
.loading-img {
 width: 70px;
 height: 70px;
 animation: rotating 2s linear infinite;
}
@keyframes rotating {
 0% {
  transform: rotate(0deg);
 }
 100% {
  transform: rotate(1turn);
 }
}
.loading-txt {
 display: flex;
 justify-content: center;
 align-items: center;
 font-size: 24px;
 color: #666;
}
</style>

(2). loading.js

import Vue from 'Vue'
import LoadingComponent from './Loading.vue'

const Loading = {}
let showLoading = false // 存储loading显示状态
let loadingNode = null // 存储loading节点元素
const LoadingConstructor = Vue.extend(LoadingComponent)

Loading.install = function (Vue) {
 Vue.prototype.$loading = function (tips, type) {
  if (type === 'hide') {
   loadingNode.isShowLoading = showLoading = false
  } else {
   if (showLoading) {
    // 如果loading还在,则不再执行
    return
   }
   loadingNode = new LoadingConstructor({
    data: {
     isShowLoading: showLoading,
     content: tips
    }
   })
   loadingNode.$mount() // 挂在实例,为了获取下面的loadingNode.$el
   document.body.appendChild(loadingNode.$el)
   loadingNode.isShowLoading = showLoading = true
  }
 };

 ['show', 'hide'].forEach(function (type) {
  Vue.prototype.$loading[type] = function (tips) {
   return Vue.prototype.$loading(tips, type)
  }
 })
}

export default Loading

然后,在 /src/main.js 中引用一下loading组件。

import Loading from './components/common/global/loading'
Vue.use(Loading)

最后,只需在要用的地方this.$loading.show('hello world')、 this.$loading.hide()

总结

以上所述是小编给大家介绍的Vue自定义全局Toast和Loading的实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
[原创]静态页面也可以实现预览 列表不同的显示方式
Oct 14 Javascript
从新浪弄下来的全屏广告代码 与使用说明
Mar 15 Javascript
top.location.href 没有权限 解决方法
Aug 05 Javascript
JS俄罗斯方块,包含完整的设计理念
Dec 11 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
May 28 Javascript
jquery属性,遍历,HTML操作方法详解
Sep 17 Javascript
Bootstrap Table使用方法解析
Oct 19 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
Nov 15 Javascript
了解ESlint和其相关操作小结
May 21 Javascript
监听element-ui table滚动事件的方法
Mar 26 Javascript
Electron 调用命令行(cmd)
Sep 23 Javascript
Vue3.0写自定义指令的简单步骤记录
Jun 27 Vue.js
javascript数据类型中的一些小知识点(推荐)
Apr 18 #Javascript
在element-ui的select下拉框加上滚动加载
Apr 18 #Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 #Javascript
vue模式history下在iis中配置流程
Apr 17 #Javascript
详解Vue 全局变量,局部变量
Apr 17 #Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
Apr 17 #Javascript
Angular Excel 导入与导出的实现代码
Apr 17 #Javascript
You might like
繁体中文转换为简体中文的PHP函数
2006/10/09 PHP
PHP cron中的批处理
2008/09/16 PHP
5种PHP创建数组的实例代码分享
2014/01/17 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
php魔术函数__call()用法实例分析
2015/02/13 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
JS的数组的扩展实例代码
2008/07/09 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
2015/10/10 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
JavaScript获取当前运行脚本文件所在目录的方法
2016/02/03 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
微信小程序报错: thirdScriptError的错误问题
2020/06/19 Javascript
vue实现广告栏上下滚动效果
2020/11/26 Vue.js
python实现简单的TCP代理服务器
2014/10/08 Python
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
Python CSV模块使用实例
2015/04/09 Python
python flask实现分页效果
2017/06/27 Python
详解python3中socket套接字的编码问题解决
2017/07/01 Python
关于反爬虫的一些简单总结
2017/12/13 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
python pandas消除空值和空格以及 Nan数据替换方法
2018/10/30 Python
python远程连接MySQL数据库
2019/04/19 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
css3遮罩层镂空效果的多种实现方法
2020/05/11 HTML / CSS
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
纪律教育学习心得体会
2014/09/02 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书