vue中使用svg封装全局消息提示组件

先看效果图

在这里插入图片描述

在这里插入图片描述

一、首先安装下载需要用到的svg相关依赖
npm install svg-sprite-loader --save-dev
二、针对没有vue.config.js文件的vue项目,直接在webpack.base.conf.js中进行如下两个配置
1.找到图片相关配置位置,添加款选出的代码

在这里插入图片描述

2.在图片配置后添加如下代码

在这里插入图片描述

三、根据添加的代码我们去src下创建一个icons文件夹,icons下面创建一个svg文件夹,用于存放svg结尾的图片

在这里插入图片描述

index.js文件夹中添加代码
import Vue from 'vue'
import SvgIcon from '../components/SvgIcon/SvgIcon'

Vue.component('svg-icon', SvgIcon)

const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
四、在components中添加SvgIcon文件夹,并创建组件svgIcon.vue,添加以下代码
<template>
	<svg class="svg-icon" aria-hidden="true" v-on="$listeners">
		<use :xlink:href="iconName" />
	</svg>
</template>

<script>
	export default {
		name: "icon-svg",
		props: {
			iconClass: {
				type: String,
				required: true
			},
			className: {
				type: String,
				default: ""
			}
		},
		computed: {
			iconName() {
				return `#icon-${this.iconClass}`;
			},
			svgClass() {
				if (this.className) {
					return "svg-icon " + this.className;
				} else {
					return "svg-icon";
				}
			}
		}
	};
</script>

<style>
	.svg-icon {
		width: 30px;
		height: 30px;
		vertical-align: -0.15em;
		fill: currentColor;
		overflow: hidden;
	}
</style>

五、在main.js中引入,src下创建的icons文件夹

在这里插入图片描述

六、至此vue中使用svg就完成,接着直接在项目中使用即可

在这里插入图片描述

完成了svg的配置 接下来试下全局消息提示
一、在components下创建Message文件夹,文件夹下创建两个文件,一个message.vue,一个index.js
message.vue下添加以下代码
<template>
	<transition name="fade">
		<div class="message_wrap" :class="type === 'success' ? 'wrap_success' : 'wrap_fail'" v-if="isShow">
			<!-- **这里引入前面创建的svg** -->
			<svg-icon :icon-class="type === 'success' ? 'success' : 'fail'" style="margin-left: 40px;"></svg-icon>
			<div class="message" :class="type === 'success' ? 'message_success' : 'message_fail'">{{text}}</div>
		</div>
	</transition>
</template>

<script>
	export default {
		name: 'message',
		props: {
			type: {
				type: String,
				default: 'success',
			},
			text: {
				type: String,
				default: '',
			},
			isShow: {
				type: Boolean,
				default: true,
			},
		},
	};
</script>

<style scoped lang="scss">
	.message_wrap {
		position: fixed;
		min-width: 400px;
		height: 64px;
		top: 6%;
		left: 50%;
		transform: translateX(-50%);
		display: flex;
		justify-content: flex-start;
		align-items: center;
		.message {
			font-size: 18px;
			line-height: 64px;
			text-align: center;
			margin-left: 16px;
		}
		.message_success {
			color: #4caf50;
		}
		.message_fail {
			color: #ff5252;
		}
	}
	.wrap_success {
		background: rgba(234,246,234, .5);
	}
	.wrap_fail {
		background: rgba(255,235,235, .5);
	}

	.fade-enter-active, .fade-leave-active {
		transition: opacity .5s
	}
	.fade-enter, .fade-leave-active {
		opacity: 0
	}
</style>

index.js中添加以下代码
import vue from 'vue'
import Message from './message'
const messageConstructor = vue.extend(Message)

const MsgMain = {
	show(text, type, duration) {
		const instance = new messageConstructor()  // 创建实例
		instance.$mount(document.createElement('div')) // 创建dom元素
		document.body.appendChild(instance.$el) // 将dom元素添加到body中

		instance.type = type  // 写入属性
		instance.text = text  // 写入属性
		instance.isShow = true // 写入属性

		setTimeout(() => {
			instance.isShow = false  // 一段时候后关闭提示
		}, duration)
	},
	success(text, duration = 2000) {
		this.show(text, 'success', duration)  // 成功时调用
	},
	error(text, duration = 2000) {
		this.show(text, 'error', duration) // 失败时调用
	},
};
// 全局注册
function Msg() {
	vue.prototype.$message = MsgMain
}

export default Msg

二、在main.js中引入

在这里插入图片描述

三、使用:最后在需要用到的地方调用即可

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值