教你如何用Vue自己实现一个message插件
今天我们来自己动手用实现一个message插件:
Vue.js 的插件应该暴露一个 install 方法。这个方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象:
//message.vue
<template>
<transition name="msg-fade">
<div class="message" :class="type" v-show="visible">
<span class="icon"></span>
<p class="content">{{content}}</p>
<span class="delete-icon" @click="onCancle">x</span>
</div>
</transition>
</template> <script>
const Msg = {
name:'message',
data(){
return {
visible:false,
type:'',
content:''
}
},
install(Vue){
Vue.prototype.$msg = (config)=>{ //通过原型注册一个方法
const MessageConstructor = Vue.extend(Msg); //生成一个Vue子类,子类就是这个组件
const instance = new MessageConstructor({data:config}); //生成该子类的实例
instance.vm = instance.$mount(); //将该实例手动挂载
document.body.appendChild(instance.vm.$el); //将实例挂载到body上
instance.vm.visible = true;
}
}
},
watch:{
visible(v){
if(v){
setTimeout(()=>{
this.onClose()
},3000)
}
}
},
methods:{
onClose(){
this.visible = false
this.$el.parentNode.removeChild(this.$el)
},
show(){
this.visible = true
},
onCancle(){
if(this.cancelBtn){
this.cancelBtn.apply(this.content)
};
this.onClose();
}
}, } export default Msg
</script> <style scoped lang='less'>
.message {
position: fixed;
left: 50%;
top: 50%;
transform: translate3d(-50%,-50%,0);
background: rgba(0,0,0, 0.6);
z-index: 1000;
min-width: 288px;
height: 32px;
box-sizing: border-box;
.icon{
display: inline-block;
width: 12px;
height: 12px;
margin-left: 16px;
background: url(../assets/default.svg) no-repeat;
background-size: 12px 12px;
vertical-align: middle;
}
&.success {
background: #EBF8F2;
border: 1px solid #A7E1C4;
border-radius: 4px;
.icon{
background: url(../assets/success.svg)no-repeat;
background-size: 12px 12px;
}
}
&.warn {
background: #FFFAEB;
border: 1px solid #FCCCA7;
border-radius: 4px;
.icon{
background: url(../assets/remind.svg)no-repeat;
background-size: 12px 12px;
}
}
&.error {
background: #FEF3EB;
border: 1px solid #FFE9A7;
border-radius: 4px;
.icon{
background: url(../assets/error.svg)no-repeat;
background-size: 12px 12px;
}
}
.content{
display: inline-block;
font-size: 12px;
color: rgba(0,0,0,0.65);
letter-spacing: 0;
line-height: 30px;
margin-left: 8px;
}
.delete-icon{
display: block;
width: 10px;
height: 10px;
position:absolute;
top:9px;
right:12px;
font-size:18px;
line-height: 10px;
cursor: pointer;
color: #000;
opacity: .43;
}
} .msg-fade-enter-active {
animation: alert-fade-in .3s;
} .msg-fade-leave-active {
animation: alert-fade-out .3s;
} @keyframes alert-fade-in {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
} @keyframes alert-fade-out {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
</style> //main.js
import msg from './components/Message';
Vue.use(msg); //使用:
this.$msg({
type:'error',
content:'这是一条自定义消息'
})
效果如图![]()
教你如何用Vue自己实现一个message插件的更多相关文章
- Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序
Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序 引子 上期给大家介绍了如何使用如何用华为HMS MLKit SDK 三十分钟在安卓上开发一个微笑抓 ...
- 教你如何用PS制作多款按钮UI设计教程
教你如何用PS制作多款按钮UI设计教程 本文教大家制作按钮的方法 LV. ★ 初入设计,学做按钮.只会套个底色,加个阴影,字体纯白,小聪明的弄个圆角. LV. ★★(描边.字体.内阴影) 看了很多案例 ...
- 手把手教你用Vue2+webpack+node开发一个H5 app
手把手教你用Vue2+webpack+node开发一个H5 app 前一篇vue2 + webpack + node 开发一个小demo说到了用vue的一些基本用法,这一篇就讲一个复杂一点的更完整的 ...
- 一篇文章教你如何用R进行数据挖掘
一篇文章教你如何用R进行数据挖掘 引言 R是一种广泛用于数据分析和统计计算的强大语言,于上世纪90年代开始发展起来.得益于全世界众多 爱好者的无尽努力,大家继而开发出了一种基于R但优于R基本文本编辑器 ...
- 零元学Expression Design 4 - Chapter 5 教你如何用自制笔刷在5分钟内做出设计感效果
原文:零元学Expression Design 4 - Chapter 5 教你如何用自制笔刷在5分钟内做出设计感效果 本章将教你如何运用笔刷与简单线条,只要5分钟,就能做出设计感效果 ? 本章将教你 ...
- 教你如何创建vue环境
教你如何创建vue的环境 wdnmd我操作了一万年,终于成功创建了vue的环境,现在就来讲一下,到底应该怎么操作才能成功创建vue的 第一步 : 我们应该做的不是别的,而是去官方网站下载文件 node ...
- 如何用一月6RMB搭建一个国外服务器
转载自我的博客:https://blog.ljyngup.com 前言 本文将教你如何用一月6RMB的价格搭建一个属于个人的外国服务器.并且一月500G流量,延迟低于500ms. 开始 导航:Virm ...
- Android | 教你如何用代码一键实现银行卡绑定
前言 小编前面几期文章分别给大家介绍了用代码实现微笑抓拍.证件照DIY.拍照翻译的功能开发(链接见文章末尾),本次小编给大家带来的是用代码一键实现银行卡识别与绑定功能. 银行卡识别的应用场景 ...
- 如何用 React Native 创建一个iOS APP?(三)
前两部分,<如何用 React Native 创建一个iOS APP?>,<如何用 React Native 创建一个iOS APP (二)?>中,我们分别讲了用 React ...
随机推荐
- 关于Matplotlib中No module named 'matplotlib.finance'的解决办法
最近在研究量化分析,需要用到matplotlib中的一个库,输入from matplotlib.finance import quotes_historical_yahoo_ohlc, candles ...
- Qt Installer Framework翻译(3-5)
指定设置选项 设置页面使用户可以指定代理设置或安装附加组件. 用户在简介页面上点击"设置"来指定设置选项. 指定代理设置 默认情况下,安装程序使用系统代理设置.用户可以选择不使用或 ...
- [题解]CSP2019 Solution - Part B
\(\text{orz}\) 一波现场 \(\text{A}\) 掉 \(\text{D1T3}\) 的神仙 D2T3 centroid Solution 考虑每个点 \(u\) 作为重心的贡献 假设 ...
- 从源码上理解Netty并发工具-Promise
前提 最近一直在看Netty相关的内容,也在编写一个轻量级的RPC框架来练手,途中发现了Netty的源码有很多亮点,某些实现甚至可以用苛刻来形容.另外,Netty提供的工具类也是相当优秀,可以开箱即用 ...
- pikachu漏洞练习之sql注入
这里因为实验的时候只记录了一部分所以就展示一部分 1.1.1数字型注入 (1)看到界面发现是查询id功能,没有在url里看到有传参所以应该是post方法提交数据. (2)进行sql注入之前我们最好是先 ...
- HCNA网络技术学习指南
网络通信基础 网络与通信 OSI模型和TCP/IP模型 网络类型 传输介质及通信方式 2 VRP基础 VRP简介 VRP命令行 登录设备 基本配置 配置文件管理 通过Telnet登录设备 文件管理 基 ...
- windows10卸载虚拟机忘记按照步骤卸载的实际问题
好久没有写博客了,由于太多事情,工作需要用到虚拟机,结果,虚拟机出问题,,,怎么办???我的办法就是卸载了重新安装一个,结果呢?太心急没有按照不知操作,今天弄了一下午,终于弄好了... 错误原因,用了 ...
- 工具之awk
转自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html awk是一个强大的文本分析工具,相对于grep的查找,sed的编 ...
- HDU-2841 Visible Trees(莫比乌斯反演)
Visible Trees 传送门 解题思路: 实际上的答案就是1~n与1~m之间互质的数的对数,写出式子就是 \(ans=\sum^{n}_{i=1}\sum^{m}_{j=1}[gcd(i,j)= ...
- jdk8 ConcurrentHashMap分析
ConcurrentHashMap分析 tryPresize() transfer() putVal() addCount() sumCount() class ConcurrentHashMap { ...