通过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 相关文章推荐
AngularJS基础学习笔记之表达式
May 10 Javascript
ajax在兼容模式下失效的快速解决方法
Mar 22 Javascript
JS动态计算移动端rem的解决方案
Oct 14 Javascript
详解Javascript百度地图接口开发文档中的类和方法
Feb 07 Javascript
SpringMVC简单整合Angular2的示例
Jul 31 Javascript
React.Js添加与删除onScroll事件的方法详解
Nov 03 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
Dec 18 Javascript
webpack写jquery插件的环境配置
Dec 21 jQuery
vue2.0模拟锚点的实例
Mar 14 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
Dec 06 Javascript
vue页面加载时的进度条功能(实例代码)
Jan 13 Javascript
JavaScript实现简易计算器小功能
Oct 22 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
网站当前的在线人数
2006/10/09 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
JavaScript DOM 添加事件
2009/02/14 Javascript
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
在javascript中创建对象的各种模式解析
2016/05/16 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
使用ionic切换页面卡顿的解决方法
2016/12/16 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
jquery在vue脚手架中的使用方式示例
2017/08/29 jQuery
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
JS实现页面数据懒加载
2020/02/13 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
2020/08/10 Javascript
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
2017/06/23 Python
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
python 实现图片批量压缩的示例
2020/12/18 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
香港时尚女装购物网站:ZAFUL
2017/07/19 全球购物
通用C#笔试题附答案
2016/11/26 面试题
卖车协议书
2014/04/21 职场文书
干部年终考核评语
2015/01/04 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
HTML+CSS实现导航条下拉菜单的示例代码
2021/08/02 HTML / CSS
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL