通过vue手动封装on、emit、off的代码详解


Posted in Javascript onMay 29, 2019

一、概念

1. $on("事件名称",回调函数)

事件绑定,一个事件名称上面可能绑定多个函数

2. $emit("事件名称",需要传递的值)

事件触发时,会触发当前事件身上所有的函数

3. $off("事件名称",[需要解绑的函数])

事件解绑时,若指定解绑函数则只解绑相应函数,否则解绑全部

二、手动封装on,emit,off事件在vue中的作用

|  在vue中进行非父子组件传值时,我们可以通过在vue的原型上添加一个公共的vue实例,组件之间调用这个公共实例的$on/$emit来传递数据,传递的一方调用$emit,接收的一方调用$on。

Vue.prototype.Observer = new Vue();  //实例化对象

|  这种方式能使所有对象拥有共同的on和emit,但是增加的属性所挂载的实例对象太大,就相当于你的一台法拉利的轮子坏了,你又买了一台新的法拉利并卸掉它的轮子,放到了原来的法拉利上,这十分耗费性能。因此,我们可以手动封装事件,来实现非父子传值。

import Observer from "./Observer"; //引入封装好的文件
Vue.prototype.Observer = Observer;  //将其添加到vue的原型上

三、封装on,emit,off事件

1. $on:创建一个事件仓库存放事件,判断事件名称是否存在。若不存在,初始化创建一个数组;若存在,将当前函数push到数组中。

const EventList = {}; //一个事件名称上面可能绑定多个函数,因此是一对多的模式,即观察者模式,数据类型采用对象
const on = function(eventName,callback){
  if(!EventList[eventName]){
    EventList[eventName] = [];
  }

  EventList[eventName].push(callback);
}

2. $emit:判断事件名称是否存在。若不存在,直接返回return;若存在,对当前事件名称所对应的所有函数进行遍历,并将参数传递过去。

const emit = function(eventName,params){
  if(!EventList[eventName])return;

  EventList[eventName].map((cb)=>{
    cb(params)
  })
}

3. $off:判断事件名称是否存在。若不存在,直接返回return;若存在,判断callback是否存在,如果存在则删除对应下标的的函数,如果不存在则将当前数组清空。

const off = function(eventName,callback){
  if(!EventList[eventName])return;

  if(callback){
    let index = EventList[eventName].indexOf(callback);
    EventList[eventName].splice(index,1);
  }else{
    EventList[eventName] = [];
  }
}

4. 导出:便于在其他文件中调用。

export default {
  $on : on,
  $emit : emit,
  $off : off
}

总结

以上所述是小编给大家介绍的通过vue手动封装on、emit、off的代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
User Scripts: Video Download by User Scripts
May 14 Javascript
javascript中match函数的用法小结
Feb 08 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
Aug 13 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
Jul 04 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
Feb 16 Javascript
Angular2 Service实现简单音乐播放器服务
Feb 24 Javascript
JavaScript严格模式下关于this的几种指向详解
Jul 12 Javascript
说说node中的可读流和可写流的区别
Jun 01 Javascript
详解JavaScript中操作符和表达式
Sep 12 Javascript
vue如何解决循环引用组件报错的问题
Sep 22 Javascript
vue封装一个简单的div框选时间的组件的方法
Jan 06 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
May 21 Javascript
el-select数据过多懒加载的解决(loadmore)
May 29 #Javascript
JS学习笔记之原型链和利用原型实现继承详解
May 29 #Javascript
vue读取本地的excel文件并显示在网页上方法示例
May 29 #Javascript
vue-cli3中vue.config.js配置教程详解
May 29 #Javascript
详解vue-cli3开发Chrome插件实践
May 29 #Javascript
vue里的data要用return返回的原因浅析
May 28 #Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
May 28 #Javascript
You might like
php下的权限算法的实现
2007/04/28 PHP
有关 PHP 和 MySQL 时区的一点总结
2008/03/26 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
javascript中call,apply,bind的用法对比分析
2015/02/12 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
vue项目打包之后背景样式丢失的解决方案
2019/01/17 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
Python中几个比较常见的名词解释
2015/07/04 Python
Python实现获取本地及远程图片大小的方法示例
2018/07/21 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
在pycharm中实现删除bookmark
2020/02/14 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
罗马尼亚在线杂货店:Pilulka.ro
2019/09/28 全球购物
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
2015/08/25 面试题
中科方德软件测试面试题
2016/04/21 面试题
机械专业应届生求职信
2013/12/12 职场文书
网站美工岗位职责
2014/04/02 职场文书
2016年学校招生广告语
2016/01/28 职场文书