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是如何实现继承的
Dec 12 Javascript
jquery实现拖拽调整Div大小
Jan 30 Javascript
JavaScript获取网页表单提交方式的方法
Apr 02 Javascript
JS实现的论坛Ajax打分效果完整实例
Oct 31 Javascript
全面理解JavaScript中的闭包
May 12 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
Aug 28 Javascript
JS实现HTML标签转义及反转义
Apr 14 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
Feb 15 Javascript
Angular5给组件本身的标签添加样式class的方法
Apr 07 Javascript
Js中使用正则表达式验证输入是否有特殊字符
Sep 07 Javascript
js实现点赞按钮功能的实例代码
Mar 06 Javascript
JS实现拖动模糊框特效
Aug 25 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
计数器详细设计
2006/10/09 PHP
php+ajax导入大数据时产生的问题处理
2014/06/11 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
jquery-easyui关闭tab自动切换到前一个tab
2010/07/29 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
2019/03/27 Javascript
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
Python subprocess模块常见用法分析
2018/06/12 Python
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
python实现计算器功能
2019/10/31 Python
如何使用Python破解ZIP或RAR压缩文件密码
2020/01/09 Python
NumPy排序的实现
2020/01/21 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
详解Python中namedtuple的使用
2020/04/27 Python
HTML5 自动聚焦(autofocus)属性使用介绍
2013/08/07 HTML / CSS
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
个人公开承诺书
2014/03/28 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
北京颐和园导游词
2015/01/30 职场文书
学习与创新自我评价
2015/03/09 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
《秋天的雨》教学反思
2016/02/19 职场文书
nginx rewrite功能使用场景分析
2022/05/30 Servers