基于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 相关文章推荐
在js中单选框和复选框获取值的方式
Nov 06 Javascript
jquery获取input的value问题说明
Aug 19 Javascript
jQuery easyui datagrid动态查询数据实例讲解
Feb 26 Javascript
禁用页面部分JavaScript方法的具体实现
Jul 31 Javascript
一个简单的jquery的多选下拉框(自写)
May 05 Javascript
使用GruntJS构建Web程序之构建篇
Jun 04 Javascript
jQuery中innerHeight()方法用法实例
Jan 19 Javascript
JS实现点击按钮控制Div变宽、增高及调整背景色的方法
Aug 05 Javascript
jQuery多级手风琴菜单实例讲解
Oct 22 Javascript
vue项目引入字体.ttf的方法
Sep 28 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
Apr 09 Javascript
webpack自动打包和热更新的实现方法
Jun 24 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制作静态网站的模板框架(一)
2006/10/09 PHP
有关 PHP 和 MySQL 时区的一点总结
2008/03/26 PHP
PHP操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
php读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
javascript 表单验证常见正则
2009/09/28 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
2014/02/12 Javascript
浅谈JS原生Ajax,GET和POST
2016/06/08 Javascript
JavaScript中Math对象的方法介绍
2017/01/05 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
jQuery实现判断滚动条滚动到document底部的方法分析
2019/08/27 jQuery
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
python+mongodb数据抓取详细介绍
2017/10/25 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
Python3爬虫中关于中文分词的详解
2020/07/29 Python
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
现代家居用品及礼品:LBC Modern
2018/06/24 全球购物
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
区域销售经理岗位职责
2013/12/10 职场文书
中秋节礼品促销方案
2014/02/02 职场文书
2014年三八妇女节活动总结
2014/03/01 职场文书
少先队学雷锋活动总结范文
2014/03/09 职场文书
学生自我评语大全
2014/04/18 职场文书
关爱残疾人演讲稿
2014/05/24 职场文书
优秀求职信
2014/05/29 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
《火烧云》教学反思
2016/02/23 职场文书
python基础之函数的定义和调用
2021/10/24 Python