基于vue框架手写一个notify插件实现通知功能的方法


Posted in Javascript onMarch 31, 2019

简单编写一个vue插件,当点击时触发notify插件,dom中出现相应内容并且在相应时间之后清除,我们可以在根组件中设定通知内容和延迟消失时间。

基于vue框架手写一个notify插件实现通知功能的方法

1. 基础知识

我们首先初始化一个vue项目,删除不需要的组件和样式,主要针对src下一些初始化资源,有过vue项目基础的应该很容易理解,如果没有vue基础建议先熟悉每个初始化文件的作用。

关于vue中如何开发插件可以直接看vue官方文档,简单了解插件开发过程,vue插件文档。

现在我们在src目录下新建一个plugin文件夹,里面存放要开发的插件notify.js

// notify.js
let notify = {  //需要在此对象拥有一个install 方法

};
notify.install = function () {
  alert('tangj')
}
// 导出这个对象,如果使用Vue.use()就会自动调用install方法
export default notify;

然后在main函数导入这个模块并使用

import notify from './plugin/notify.js'
Vue.use(notify)

运行这个vue项目可以看到,页面开始加载有一个弹出框,说明我们创建的插件调用成功

基于vue框架手写一个notify插件实现通知功能的方法

2. notify.js主要功能

上面我们知道了,Vue.use()会自动调用install方法,install第一个参数为Vue构造函数,第二个参数即为输入的内容,默认undefined,所以我们在调用一开始的时候为Vue这个构造函数的原型上添加一个$notify方法,此后,每一个Vue的实例都能调用这个方法,这样我们就可以通过给根组件绑定一个点击事件,让$notify执行。

当然这样还是不够的,回到开头说的,根组件可以设定通知内容和通知延迟时间,相当于给this.$notify传递两个参数,第一个是通知内容,第二个是延迟时间。

因此,原型上的notify函数还得接受两个参数,当有通知内容把通知内容替代,有延迟时间把延迟时间替代,为了插件的完整性,记得要给参数设定默认值。

总结一下业务逻辑:点击页面需要出现一个通知内容,经过延迟时间后消失,所以我们可以导入一个模块,并把这个模块挂载到页面上,经过相应的延迟时间后移除

import modal from './notify.vue'
let notify = {  //需要在此对象拥有一个install 方法

};
notify.install = function (Vue,options={delay:3000}) {    
  Vue.prototype.$notify = function (message,opt={}) {
    options = {...options,...opt}; //用自己调用插件时传递过来的属性覆盖默认设置的值
    let v = Vue.extend(modal); //返回的是一个构造函数的子类,参数是包含组件选项的对象
    let vm = new v;
    let oDiv = document.createElement('div'); //创建一个div将实例挂载到元素上
    vm.$mount(oDiv);
    vm.value = message;
    document.body.appendChild(vm.$el);
    setTimeout(()=>{ //根据delay将dom元素移除
      document.body.removeChild(vm.$el);
    },options.delay) 
  }
}
// 导出这个对象,如果使用Vue.use()就会自动调用install方法
export default notify;

3. 完善notify.js

现在还有一个问题,我们不断点击的时候,会通知很多个组件,这显然不符合预期

基于vue框架手写一个notify插件实现通知功能的方法

解决的办法很简单,我们只要在执行之前判断是否已经存在了这个实例,如果存在直接返回不再继续,如果不存在,那么执行往后的逻辑

notify.install = function (Vue,options={delay:3000}) {    
  Vue.prototype.$notify = function (message,opt={}) {
    if(notify.el)return;//判断dom上是否存在这个实例
    options = {...options,...opt}; 
    let v = Vue.extend(modal); 
    let vm = new v;
    let oDiv = document.createElement('div'); 
    vm.$mount(oDiv);
    vm.value = message;
    document.body.appendChild(vm.$el);
    notify.el = vm.$el;   //把实例给notify对象    
    setTimeout(()=>{ 
      document.body.removeChild(vm.$el);
      notify.el = null; // 清空这个对象
    },options.delay) 
  }
}

最后

这是很简单的一个vue插件写法,我们可以用这种思维创造很多有用的插件,比如vue-router、vue-awesome-swiper等等,很大程度上提高了开发效率

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript实现简单二级下拉菜单实例
Jun 15 Javascript
nw.js实现类似微信的聊天软件
Mar 16 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
Mar 24 Javascript
javascript中call和apply的用法示例分析
Apr 02 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
Nov 24 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
Feb 18 Javascript
vue 实现axios拦截、页面跳转和token 验证
Jul 17 Javascript
在JS循环中使用async/await的方法
Oct 12 Javascript
基于Koa2写个脚手架模拟接口服务的方法
Nov 27 Javascript
vue结合element-ui使用示例
Jan 24 Javascript
jQuery实现动态生成年月日级联下拉列表示例
May 11 jQuery
JS中的一些常用的函数式编程术语
Jun 15 Javascript
基于elementUI实现图片预览组件的示例代码
Mar 31 #Javascript
微信小程序访问豆瓣电影api的实现方法
Mar 31 #Javascript
vue项目首屏打开速度慢的解决方法
Mar 31 #Javascript
jQuery事件blur()方法的使用实例讲解
Mar 30 #jQuery
Javascript实现一朵从含苞到绽放的玫瑰
Mar 30 #Javascript
使用post方法实现json往返传输数据的方法
Mar 30 #Javascript
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
Mar 30 #Javascript
You might like
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
详解PHP中的null合并运算符
2015/12/30 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
javascript 打印页面代码
2009/03/24 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
js实现翻页后保持checkbox选中状态的实现方法
2012/11/03 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
jquery+php实现滚动的数字特效
2015/11/29 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
python3.4爬虫demo
2019/01/22 Python
python def 定义函数,调用函数方式
2020/06/02 Python
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
JD Sports瑞典:英国领先的运动时尚商店
2018/01/28 全球购物
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
技术副厂长岗位职责
2013/12/26 职场文书
成功的餐厅经营创业计划书
2014/01/15 职场文书
数控专业个人求职信范文
2014/02/05 职场文书
离婚协议书范本
2015/01/26 职场文书
学习与创新自我评价
2015/03/09 职场文书
php png失真的原因及解决办法
2021/10/24 PHP