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 相关文章推荐
js实时获取系统当前时间实例代码
Jun 28 Javascript
关于jquery中全局函数each使用介绍
Dec 10 Javascript
js使下拉列表框可编辑不止是选择
Dec 12 Javascript
javascript刷新父页面的各种方法汇总
Sep 03 Javascript
JavaScript数组常用方法
Mar 02 Javascript
javascript结合CSS实现苹果开关按钮特效
Apr 07 Javascript
js阻止冒泡和默认事件(默认行为)详解
Oct 20 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
May 24 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
Apr 28 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
Mar 24 Javascript
详解为什么Vue中不要用index作为key(diff算法)
Apr 04 Javascript
Vue实现点击箭头上下移动效果
Jun 11 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
windows xp下安装pear
2006/12/02 PHP
php 分库分表hash算法
2009/11/12 PHP
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
jQuery.ajax 用户登录验证代码
2010/10/29 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
jQuery实现点击水纹波动动画
2016/04/10 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
vue中v-model动态生成的实例详解
2017/10/27 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
Python深入学习之闭包
2014/08/31 Python
python中尾递归用法实例详解
2015/04/28 Python
Python+Opencv识别两张相似图片
2020/03/23 Python
python实现词法分析器
2019/01/31 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
pytorch1.0中torch.nn.Conv2d用法详解
2020/01/10 Python
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
财务总监管理岗位职责
2014/03/08 职场文书
家庭教育的心得体会
2014/09/01 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
详解Redis瘦身指南
2021/05/26 Redis
Python标准库之typing的用法(类型标注)
2021/06/02 Python
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python