vue项目中仿element-ui弹框效果的实例代码


Posted in Javascript onApril 22, 2019

最近要写个弹框,发现element-ui弹框样式还可以,就copy下来改吧改吧。也不分步骤详细介绍了直接上代码。

在组件目录中新建文件夹message

我把message目录里的东西给大家贴出来

vue项目中仿element-ui弹框效果的实例代码

message文件夹

vue项目中仿element-ui弹框效果的实例代码

src文件夹

index.js

import Message from './src/main.js';
export default Message;

mian.js

import Vue from 'vue';
import Main from './main.vue';
let MessageConstructor = Vue.extend(Main);
let instance;
let instances = [];
let seed = 1;
const Message = (options = {}) => {
 if (typeof options === 'string') {
 options = {
  message: options
 };
 }
 let userOnClose = options.onClose;
 let id = 'message_' + seed++;
 options.onClose = function() {
 Message.close(id, userOnClose);
 };
 instance = new MessageConstructor({
 data: options
 });
 instance.id = id;
 instance.vm = instance.$mount();
 document.body.appendChild(instance.vm.$el);
 instance.vm.visible = true;
 instance.dom = instance.vm.$el;
 instance.dom.style.zIndex = 999;
 instances.push(instance);
 return instance.vm;
}
['success', 'warning', 'info', 'error'].forEach(type => {
 Message[type] = options => {
 if (typeof options === 'string') {
  options = {
  message: options
  };
 }
 options.type = type;
 return Message(options);
 };
});
Message.close = function(id, userOnClose) {
 for (let i = 0, len = instances.length; i < len; i++) {
 if (id === instances[i].id) {
  if (typeof userOnClose === 'function') {
  userOnClose(instances[i]);
  }
  instances.splice(i, 1);
  break;
 }
 }
};
Message.closeAll = function() {
 for (let i = instances.length - 1; i >= 0; i--) {
 instances[i].close();
 }
};

export default Message;

mian.vue

<template>
 <transition name="message-fade">
  <div :class="[
   'message',
   type && !iconClass ? `message-${ type }` : '',
   center ? 'center' : '',
   showClose ? 'closable' : '',
   customClass
   ]"
    v-show="visible"
    @mouseenter="clearTimer"
    @mouseleave="startTimer">
   <i :class="iconClass" v-if="iconClass"></i>
   <i :class="typeClass" v-else></i>
   <slot>
    <p v-if="!dangerouslyUseHTMLString" class="message-content">{{ message }}</p>
    <p v-else v-html="message" class="message-content"></p>
   </slot>
   <i v-if="showClose" class="message-close-btn icon-close" @click="close"></i>
  </div>
 </transition>
</template>
<script>
 const typeMap = {
 success: 'success',
 info: 'info',
 warning: 'warning',
 error: 'error'
 };
 export default {
 data () {
  return {
  visible: false,
  message: '',
  duration: 1000,
  type: 'info',
  iconClass: '',
  customClass: '',
  onClose: null,
  showClose: false,
  closed: false,
  timer: null,
  dangerouslyUseHTMLString: false,
  center: false
  }
 },
 computed: {
  typeClass() {
  return this.type && !this.iconClass
   ? `message-icon icon-${ typeMap[this.type] }`
   : '';
  }
 },
 watch: {
  closed(newVal) {
  if (newVal) {
   this.visible = false;
   this.$el.addEventListener('transitionend', this.destroyElement);
  }
  }
 },
 methods: {
  destroyElement() {
  this.$el.removeEventListener('transitionend', this.destroyElement);
  this.$destroy(true);
  this.$el.parentNode.removeChild(this.$el);
  },
  close() {
  this.closed = true;
  if (typeof this.onClose === 'function') {
   this.onClose(this);
  }
  },
  clearTimer() {
  clearTimeout(this.timer);
  },
  startTimer() {
  if (this.duration > 0) {
   this.timer = setTimeout(() => {
   if (!this.closed) {
    this.close();
   }
   }, this.duration);
  }
  },
  keydown(e) {
  if (e.keyCode === 27) { // esc关闭消息
   if (!this.closed) {
   this.close();
   }
  }
  }
 },
 mounted() {
  this.startTimer();
  document.addEventListener('keydown', this.keydown);
 },
 beforeDestroy() {
  document.removeEventListener('keydown', this.keydown);
 }
 }
</script>
<style lang="less">
 .message {
  min-width: 200px;
  box-sizing: border-box;
  border-radius: 3px;
  border: 1px solid #ebeef5;
  position: fixed;
  left: 50%;
  top: 20px;
  transform: translateX(-50%);
  background-color: #edf2f3;
  transition: opacity 0.3s, transform .4s;
  overflow: hidden;
  padding: 10px;
  display: flex;
  align-items: center;
 }
 .message-icon{
  width: 15px;
  height: 15px;
  border-radius: 100%;
  background: #fff;
  display: inline-block;
  margin-right: 10px;
  &.icon-success{
   background: url("../../../assets/image/icon-success.png") no-repeat center center;
   background-size: auto 100%;
  }
  &.icon-error{
   background: url("../../../assets/image/icon-error.png") no-repeat center center;
   background-size: auto 100%;
  }
  &.icon-info{
   background: url("../../../assets/image/icon-info.png") no-repeat center center;
   background-size: auto 100%;
  }
  &.icon-warning{
   background: url("../../../assets/image/icon-warning.png") no-repeat center center;
   background-size: auto 100%;
  }
 }
 .message-success{
  background: #f2f8ec;
  border-color: #e4f2da;
  .message-content{
   color: #7ebe50;
  }
 }
 .message-error{
  background: #fcf0f0;
  border-color: #f9e3e2;
  .message-content{
   color: #e57470;
  }
 }
 .message-warning{
  background: #fcf6ed;
  border-color: #f8ecda;
  .message-content{
   color: #dca450;
  }
 }
 .message-info{
  background: #eef2fb;
  border-color: #ebeef4;
  .message-content{
   color: #919398;
  }
 }
 .message-fade-enter,
 .message-fade-leave-active {
  opacity: 0;
  transform: translate(-50%, -100%);
 }
</style>

以上就是封装的所有代码
 接下来就来看看如何引用

main.js中引入

import Message from '@/components/message/index.js'

Vue.prototype.$message = Message

调用

在你需要的页面调用

this.$message({
  message: '提示消息',
  type:'error' //type有四个值 1.error 2.success 3.info 4.warning
});

vue项目中仿element-ui弹框效果的实例代码

type为success

vue项目中仿element-ui弹框效果的实例代码

type为warning

vue项目中仿element-ui弹框效果的实例代码

type为info

vue项目中仿element-ui弹框效果的实例代码

type为errpr

小icon的图片用自己的图片哦

总结

以上所述是小编给大家介绍的vue项目中仿element-ui弹框效果的实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
checkbox 多选框 联动实现代码
Oct 22 Javascript
jQuery 数据缓存data(name, value)详解及实现
Jan 04 Javascript
JS面向对象编程之对象使用分析
Aug 19 Javascript
IE关闭时判断及AJAX注销案例学习
Feb 18 Javascript
9行javascript代码获取QQ群成员具体实现
Oct 16 Javascript
JavaScript中的Web worker多线程API研究
Dec 06 Javascript
vuejs动态组件给子组件传递数据的方法详解
Sep 09 Javascript
Javascript之面向对象--接口
Dec 02 Javascript
微信小程序返回多级页面的实现方法
Oct 27 Javascript
react高阶组件添加和删除props
Apr 26 Javascript
layui清空,重置表单数据的实例
Sep 12 Javascript
JS使用正则表达式判断输入框失去焦点事件
Oct 16 Javascript
对于防止按钮重复点击的尝试详解
Apr 22 #Javascript
Vue render函数实战之实现tabs选项卡组件
Apr 22 #Javascript
详解Vue依赖收集引发的问题
Apr 22 #Javascript
JS大坑之19位数的Number型精度丢失问题详解
Apr 22 #Javascript
Vue $mount实战之实现消息弹窗组件
Apr 22 #Javascript
深入理解vue中的slot与slot-scope
Apr 22 #Javascript
浅析vue插槽和作用域插槽的理解
Apr 22 #Javascript
You might like
在项目中寻找代码的坏命名
2012/07/14 PHP
单台服务器的PHP进程之间实现共享内存的方法
2014/06/13 PHP
php实现json编码的方法
2015/07/30 PHP
一段实用的php验证码函数
2016/05/19 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
layui 弹出层值回传解决方式
2019/11/14 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
ES6学习教程之Promise用法详解
2020/11/22 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
python实现textrank关键词提取
2018/06/22 Python
如何通过python画loss曲线的方法
2019/06/26 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
python中count函数简单的实例讲解
2020/02/06 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
Django多数据库联用实现方法解析
2020/11/12 Python
美国电视购物:QVC
2017/02/06 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
会计实习生自我鉴定
2013/12/12 职场文书
实习老师离校感言
2014/02/03 职场文书
经济信息系毕业生自荐信范文
2014/03/15 职场文书
信用卡催款律师函
2015/05/27 职场文书
领导离职感言
2015/08/03 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
mysql序号rownum行号实现方式
2022/12/24 MySQL