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 相关文章推荐
javascript 新浪背投广告实现代码
Jul 07 Javascript
网页编辑器ckeditor和ckfinder配置步骤分享
May 24 Javascript
javascript实现日历控件(年月日关闭按钮)
Dec 12 Javascript
前端必备神器 Snap.svg 弹动效果
Nov 10 Javascript
纯CSS3代码实现滑动开关效果
Aug 19 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
Dec 08 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
Mar 09 Javascript
JQuery 选择器、DOM节点操作练习实例
Sep 28 jQuery
在Vue项目中引入腾讯验证码服务的教程
Apr 03 Javascript
react-router-dom 嵌套路由的实现
May 02 Javascript
微信小程序中的列表切换功能实例代码详解
Jun 09 Javascript
JavaScript中ES6规范中let和const的用法和区别
Aug 06 Javascript
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获取表单中多个同名input元素的值
2014/03/20 PHP
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
jQuery常见开发技巧详细整理
2013/01/02 Javascript
在JavaScript中重写jQuery对象的方法实例教程
2014/08/25 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
js实现选中页面文字将其分享到新浪微博
2015/11/05 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
vue-cli安装使用流程步骤详解
2018/11/08 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
js实现适配移动端的拖动效果
2020/01/13 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
python从子线程中获得返回值的方法
2019/01/30 Python
python中with用法讲解
2020/02/07 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
你需要学会的8个Python列表技巧
2020/06/24 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
HTML5表格_动力节点Java学院整理
2017/07/11 HTML / CSS
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
二手房购房意向书范本
2014/04/01 职场文书
党员自我对照检查材料
2014/08/19 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
夫妻忠诚协议书范本
2014/11/17 职场文书
2014年行政执法工作总结
2014/12/11 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
走进科学观后感
2015/06/18 职场文书
python 远程执行命令的详细代码
2022/02/15 Python