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字典探测用户名工具
Oct 05 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
Oct 29 Javascript
JavaScript的setAttribute兼容性问题解决方法
Nov 11 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
Dec 01 Javascript
JavaScript 变量、作用域及内存
Apr 08 Javascript
JQuery包裹DOM节点的方法
Jun 11 Javascript
json数据处理及数据绑定
Jan 25 Javascript
webpack中使用iconfont字体图标的方法
Feb 22 Javascript
AjaxUpLoad.js实现文件上传
Mar 05 Javascript
jQuery实现动态加载select下拉列表项功能示例
May 31 jQuery
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
Feb 21 Javascript
JS实现瀑布流效果
Mar 07 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读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
javascript判断chrome浏览器的方法
2014/03/26 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
基于jQuery实现搜索关键字自动匹配功能
2020/03/26 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
JS实现字符串转日期并比较大小实例分析
2015/12/09 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
2016/12/13 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
js实现秒表计时器
2019/12/16 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
Python的print用法示例
2014/02/11 Python
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
关于PyTorch源码解读之torchvision.models
2019/08/17 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
keras模型可视化,层可视化及kernel可视化实例
2020/01/24 Python
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
毕业生如何写自荐信
2014/03/26 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
教书育人演讲稿
2014/09/11 职场文书
安全第一课观后感
2015/06/18 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
《司马光》教学反思
2016/02/22 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android
Python Matplotlib库实现画局部图
2021/11/17 Python
教你nginx跳转配置的四种方式
2022/07/07 Servers