基于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 相关文章推荐
xmlHTTP实例
Oct 24 Javascript
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
Dec 23 Javascript
在js中单选框和复选框获取值的方式
Nov 06 Javascript
用AJAX返回HTML片段中的JavaScript脚本
Jan 04 Javascript
jQuery中Form相关知识汇总
Jan 06 Javascript
AngularJS入门教程之控制器详解
Jul 27 Javascript
全面解析标签页的切换方式
Aug 21 Javascript
vue如何实现observer和watcher源码解析
Mar 09 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
Jul 03 Javascript
javascript导出csv文件(excel)的方法示例
Aug 25 Javascript
使用React代码动态生成栅格布局的方法
May 24 Javascript
vue 给数组添加新对象并赋值
Apr 20 Vue.js
基于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基础学习笔记
2007/03/18 PHP
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
PHP7 弃用功能
2021/03/09 PHP
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
openlayers实现图标拖动获取坐标
2020/09/25 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
[01:11:15]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
2018/01/29 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
tensorflow输出权重值和偏差的方法
2018/02/10 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
2020/02/28 Python
美国咖啡批发网站:Coffee.org
2017/06/29 全球购物
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
学生周末长期请假条
2014/02/15 职场文书
效能监察建议书
2014/05/19 职场文书
公司老总年会致辞
2015/07/30 职场文书
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL