vuetify全局提示组件

模仿elment 的Message

elment 有一个Message 可以全局提示的控件很是羡慕,但是作为一位后端人员又不想搞太多前端css,喜欢用vuetify,但是没有全局Message,只好自己动手实现一个了。

.先看一下效果,成功提示框:在这里插入图片描述
失败提示框:
在这里插入图片描述
接下来让我们一步步实现
首先在src/commponents/下创建Message目录,并在Message目录下创建
Message.vue和index.js文件,文件位置如下:
在这里插入图片描述
Message.vue的代码如下:

<template>
	<transition name="message-fade">
		<div class="message" :class="typeClass" role="alert" v-show="visible">
			<p class="message__content">
				<v-icon large :color="color" small=true>{{icon}}</v-icon>  &nbsp;{{message}}
			</p>
		</div>
	</transition>
</template>

<script>
	export default {
		name: 'message',

		data() {
			return {
				visible: false,
				duration: 2000,
				message: '',
				timer: null,
				closed: false,
				color: "",
				icon: "",
				typeClass:""
			}
		},

		watch: {
			closed(val) {
				if (val) {
					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)
			},

			startTimer() {
				if (this.duration > 0) {
					this.timer = setTimeout(() => {
						if (!this.closed) {
							this.close()
						}
					}, this.duration)
				}
			},

			close() {
				this.closed = true
			}
		},

		mounted() {
			// 开始定时器
			this.startTimer()
		}
	}
</script>

<style scoped>
	.message {
		min-width: 380px;
		box-sizing: border-box;
		border-radius: 4px;
		border-width: 1px;
		border-style: solid;
		/* border-color: #ebeef5; */
		position: fixed;
		left: 50%;
		top: 20px;
		transform: translateX(-50%);
		/* background-color: #edf2fc; */
		transition: opacity .3s, transform .4s;
		overflow: hidden;
		padding: 15px 15px 15px 20px;
		display: flex;
		align-items: center
	}

	.message--success {
		background-color: #f0f9eb;
		border-color: #e1f3d8;
		color: #67c23a;
	}

	.message--error {
	background-color: #FFCCFF;
	border-color: #FFCCFF;
	color: #CC0033;
	}

	.message p {
		margin: 0
	}

	.message__content {
		padding: 0;
		font-size: 14px;
		line-height: 1;
	}

	.message-fade-enter,
	.message-fade-leave-active {
		opacity: 0;
		transform: translate(-50%, -100%)
	}
</style>

index中的代码如下:

import Vue from 'vue'
import Main from './Message.vue'

let MessageConstructor = Vue.extend(Main)

let instance
let instances = []
let seed = 1
const Message = function (options,color,icon,typeClass) {
  options = options || {}
  if (typeof options === 'string') {
    options = {
      message: options,
	  color:color,
	  icon:icon,
	  typeClass:typeClass
    }
  }
  let id = 'message_' + seed++
  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 = 10000
  instances.push(instance)
  return instance.vm
}

Message.success = function(option){
	Message(option,"#67c23a","beenhere","message--success")
}
Message.error = function(option){
	Message(option,"#CC0033","mdi-backspace","message--error")
}

Message.close = function (id) {
  for (let i = 0, len = instances.length; i < len; i++) {
    if (id === instances[i].id) {
      instances.splice(i, 1)
      break
    }
  }
}

Message.closeAll = function () {
  for (let i = instances.length - 1; i >= 0; i--) {
    instances[i].close()
  }
}

export default Message

由于某些原因未实现警告框,如果需要添加,请在Message.vue中的style添加如下:【请改变下列颜色,不要原封不动】

.message--alert {
		//背景颜色
		background-color: #f0f9eb;
		//边框颜色
		border-color: #e1f3d8;
		//文字颜色
		color: #67c23a;
	}

index.js中添加如下,

Message.alert= function(option){
	//请更改第二个和第三个参数,第三个参数是图标,就像success的‘√’,第二个参数是图标的颜色
	Message(option,"#67c23a","beenhere","message--alert")
}

不过,警告框好像没什么作用,那么如上就当作我在帮忙讲解一下这些内容吧,接下来讲一下怎么用

首先需要在main.js中注册


import Message from './components/Message/index.js'
//引入这个是为了解决有时候图标展示不正常,可以先注释了尝试一下
import 'material-design-icons-iconfont/dist/material-design-icons.css'

Vue.prototype.$message = Message

第二个参数亲测不加会有些图标展示不正常或者不出现,详细解决办法请参考部分图标展示不正常
也可以先不解决这个问题,看一下正常不,不正常在返回来解决这个问题,也很简单【温馨提示:在进入上述链接执行npm命令后我会出现node_modules中axios引用被删除的问题,本着不求甚解的精神,为了以防万一,建议首先将这个文件夹复制出来,在执行之后如果被删除,粘贴进去即可!】
接下来就可以在想使用的地方使用了:如下

//成功提示
this.$message.success(`success这是一条消息`)
//失败提示
this.$message.error(`error这是一条消息`)

还有一个问题,在使用拦截器interceptors的时候,做统一异常处理的时候回调用this.$message.error(error这是一条消息) 的时候没有效果,这个是因为this都找不到,这个时候如下操作:

//导入/components/Message/index.js
import Message from '../components/Message/index.js'

然后可以使用Message.error();来进行调用。
统一异常处理本博文就不进行讲述了,大家可以去自己找一下,如有问题可以联系博主,我看到会尽力解决的

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
=============================================================================== 组件名称:消息提示组件 =============================================================================== 组件说明:用于替代系统默认的灰色对话框(alert等),提供丰富多彩的消息提示皮肤外观。 =============================================================================== 组件简介: 1、调用方式进行二次分装,现编写成类,然后将调用方法变成几个简单的方法调用,调用时无需new了。调用方法明了简单。 2、兼容IE6.0+、FF1.5+、Opear9+,兼容HTML4/XHTML1.0页面渲染模式。 3、支持CSS皮肤定制。目前提供了五种皮肤,Vista、QQ、dmm-green、ExtBlue和BlackColl。有兴趣可以修改样式表文件定义新的皮肤。 4、提供四种消息类型。分别为消息提示、成功信息、错误信息、询问信息。 5、弹出消息框时屏蔽页面其它元素的操作,自动隐藏页面select及iframe下select(无限级select隐藏),并遮罩iframe等元素。 6、页面select控件状态还原时保持原状态,即如果原来select就是隐藏的,则消息框弹出并关闭后该select仍保持隐藏状态,而只显示原本显示的select。 7、消息组件弹出时屏蔽除Tab和回车外的几乎所有键盘操作(包括F5),“消息确认框”支持“tab键/左右方向键”切换确定/取消焦点。 8、支持在iframe页面中弹出消息框时遮盖最外层页面(需引用扩展文件ymPromptEx.js)。 9、只要组件js与样式目录相对位置不变,无论将组件放在哪个文件夹中都只需正确引入js文件即可,组件会自动得到css的路径。
Vue3封装全局弹窗组件的步骤如下: 1. 创建一个Vue实例,作为全局弹窗组件的容器。可以使用`createApp`方法创建Vue实例,并将其挂载到一个DOM元素上。 2. 在全局弹窗组件上定义必要的属性和方法。比如,可以定义一个`visible`属性控制弹窗的显示与隐藏,一个`title`属性用于显示弹窗的标题,一个`content`属性用于显示弹窗的内容等。 3. 在全局弹窗组件内部实现弹窗的样式和交互逻辑。可以使用Vue的模板语法和样式定义实现弹窗的外观和样式效果,并通过Vue的响应式特性,实现弹窗的交互逻辑,比如点击关闭按钮时隐藏弹窗。 4. 添加全局方法,在Vue实例的原型上添加一个方法,用于在任意组件中调用弹窗组件。可以使用`app.config.globalProperties`来添加全局方法,以便在任何地方都可以访问到该方法。 5. 在组件中使用全局弹窗组件。在需要显示弹窗的组件中,通过调用全局方法来调用弹窗组件。可以通过传递参数的方式,动态设置弹窗的内容和样式。 6. 在全局弹窗组件的内部实现弹窗的生命周期钩子函数,比如`mounted`函数用于在弹窗组件被挂载到DOM后执行相应的逻辑。 通过以上步骤,就可以封装一个可在任何组件中使用的全局弹窗组件。在使用过程中,只需要调用全局方法,传入相应的参数,即可显示自定义的弹窗内容和样式,提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值