Vue自定义toast组件的实例代码


Posted in Javascript onAugust 15, 2018

写了两三天,终于把toast组件写出来了。不敢说是最好的设计,希望有更好思路的朋友可以在评论区给我意见!_(:з」∠)_

第一步:写toast.vue,将样式之类的先定下来

<template>
 <div v-show="showToast" class="toast" :class="position">
 <div class="toast_container" v-if="type=='success'">
  <div><i class="iconfont icon-check icon"></i></div>
  <div class="msg_container">{{message}}</div>
 </div>
 <div class="toast_container" v-else-if="type=='wrong'">
  <div><i class="iconfont icon-warning-circle icon"></i></div>
  <div class="msg_container">{{message}}</div>
 </div>
 <div class="toast_container" v-else-if="type=='loading'">
  <div><loading10></loading10></div>
  <div class="msg_container">{{message}}</div>
 </div>
</div>
</template>
<script>
import loading10 from '../loading/spiner'
export default{
 props:{
  message:String,
  type:{
   validator: function (value) {
   // 值必须是这些字符串中的一个
   return ['success', 'wrong', 'loading'].indexOf(value) !== -1
  },
   default:'success'
  },
  duration:{
   type:Number,
   default:3000
  },
   position:{
   type:String,
   default:'middle'
  }
 },
 components:{
  loading10
 },
 data(){
  return{
   showToast:false
  }
 }
}
</script>
<style scoped>
.toast{
 width:100%;
}
.toast_container{
 background: rgba(0, 0, 0, 0.7);
 border-radius: 8px;
 color:#fff;
 margin-left:88px;
 margin-right:88px;
 text-align:center;
 padding-top:15px;
 padding-bottom: 15px; 
}
.top{
 position:absolute;
 top:10%;
}
.middle{
 position:absolute;
 top:40%;
}
.bottom{
 position:absolute;
 top:70%;
}
.msg_container{
 margin-top:8px;
 margin-left:15px;
 margin-right:15px;
 line-height: 22px;
 font-size: 16px;
 word-wrap: break-word;
}
.icon{
 font-size:30px;
}
</style>

Vue自定义toast组件的实例代码Vue自定义toast组件的实例代码Vue自定义toast组件的实例代码

一共三种样式,成功(success),失败(wrong),加载中(loading);

一共三种位置,上(top),中(middle),下(bottom);

所有涉及的图案出自阿里的iconfont 手机淘宝图标库。

加载中动画是自己写的蹩脚的加载组件(emmm,就不放出来污染大家眼睛了,需要的可以评论区知会一声_(:з」∠)_)

第二步:写index.js ,完成toast组件的实例化

import Vue from 'vue'
import Toast from './toast'
let singleToast=true;
let queue=[];
function createInstance(){
 // 返回一个扩展实例构造器
 if(!queue.length||!singleToast){
 const ToastConstructor = Vue.extend(Toast);
 // 构造一个实例
 const toastDom = new ToastConstructor({
 el: document.createElement('div'),
 });
 // 把实例化的 toast.vue 添加到 body 里
 document.body.appendChild(toastDom.$el);
 queue.push(toastDom);
 singleToast=true;
 return toastDom;
 }
};
// 注册为全局组件的函数
function toast(options= {}) {
 const toastDom = createInstance();
 toastDom.message =typeof options === 'string' ? options : options.message;
 toastDom.type = options.type || 'success';
 toastDom.duration = options.duration || 3000;
 toastDom.position = options.position || 'middle';
 if(!toastDom.message){
 toastDom.showToast =singleToast= false;
 }else{
 toastDom.showToast=true;
 setTimeout(() => {toastDom.showToast =singleToast= false} ,toastDom.duration);
 }
}
// 将组件注册到 vue 的 原型链里去,
// 这样就可以在所有 vue 的实例里面使用 this.$toast()
// Vue.prototype.$toast = showToast
Vue.prototype.$toast = toast;
export default toast

设置singleToast和queue的目的在于:确保同一时期界面上只有一个toast,不能同时出现多个toast。

由于toast会初始化,因此为了避免在任何操作之前界面上就出现一个toast,用if语句判断:

如果没有传入的message,则不显示toast(这样可以使得初始化的toast不显示)

否则显示,并且过一定时间消失,只有singleToast为false,说明此刻界面上没有toast,才能再新建一个toast实例(因为此时if判断内queue.length 不为0【初始化的toast组件本身占了一个位置】,而singleToast为false,因此可以创建)

第三步:使用

在main.js 添加如下代码:

import toast from './components/toast/index'
Vue.use(toast)

创建需要调用的Vue文件:

<template>
 <div>
  <input type="button" value="显示弹窗" @click="showToast">
 </div>
</template>
 <script>
 export default {
  methods: {
   showToast () {
    this.$toast({message:'加载中',type:'loading',position:'bottom',
     duration:'2000'});
    // this.$toast('成功提示');
   }
  }
 }
 </script>

Vue自定义toast组件的实例代码

可以看到一共两种方式,可以以对象方式传入参数,也可以只传入字符串,其他采用默认设置。

总结

以上所述是小编给大家介绍的SVue自定义toast组件的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript Date对象使用总结
May 14 Javascript
javascript跑马灯悬停放大效果实现代码
Dec 12 Javascript
js中的eventType事件及其浏览器支持性介绍
Nov 29 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
Apr 06 Javascript
利用CSS3在Angular中实现动画
Jan 15 Javascript
js中window.open的参数及注意注意事项
Jul 06 Javascript
javascript创建含数字字母的随机字符串方法总结
Aug 01 Javascript
深入理解JavaScript中的预解析
Jan 04 Javascript
创建一般js对象的几种方式
Jan 19 Javascript
JS获取当前地理位置的方法
Oct 25 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
Jun 07 Javascript
微信小程序-API接口安全详解
Jul 16 Javascript
JavaScript中set与get方法用法示例
Aug 15 #Javascript
基于JavaScript实现瀑布流布局
Aug 15 #Javascript
解决Layui 表单提交数据为空的问题
Aug 15 #Javascript
jQuery轮播图实例详解
Aug 15 #jQuery
JS实现获取毫秒值及转换成年月日时分秒的方法
Aug 15 #Javascript
对layui中表单元素的使用详解
Aug 15 #Javascript
layui中使用jquery控制radio选中事件的示例代码
Aug 15 #jQuery
You might like
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
php检测文件编码的方法示例
2014/04/25 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
jquery之Document元素选择器篇
2008/08/14 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
浅析JavaScript中var that=this
2017/02/17 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
Python获取当前时间的方法
2014/01/14 Python
python魔法方法-自定义序列详解
2016/07/21 Python
Python和C/C++交互的几种方法总结
2017/05/11 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
TensorFlow安装及jupyter notebook配置方法
2017/09/08 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
python随机模块random使用方法详解
2020/02/14 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
常用的10个Python实用小技巧
2020/08/10 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
基于HTML5的WebSocket的实例代码
2018/08/15 HTML / CSS
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
CAD制图设计师自荐信
2014/01/29 职场文书
三严三实对照检查材料
2014/09/22 职场文书
违章停车检讨书
2014/10/21 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
详解java如何集成swagger组件
2021/06/21 Java/Android