js中订阅发布模式bus
export default {
list: {}, // 事件中心集中地
/**
* 发布订阅
* @param {string} name 事件名
* @param [...args]
*/
$emit: function (name) {
if (this.list[name]) {
for (let i = 0; i < this.list[name].length; i++) {
this.list[name][i].apply(this, Array.from(arguments).slice(1));
}
}
},
/**
* 订阅一次后取消订阅
* @param {string} name 事件名
* @param {*} fn
*/
$once: function (name, fn) {
function on() {
// 触发一次后移除
fn.apply(this, arguments);
this.$off(name, on);
}
// 加个标识,如一次都没触发的时候也可以手动移除订阅
on.fn = fn;
this.$on(name, on);
},
/**
* 订阅
* @param {string|Array<strig>} name 事件名
* @param {Function} fn
* @returns
*/
$on: function (name, fn) {
// 传入的数组循环调用订阅
if (Array.isArray(name)) {
for (let i = 0; i < name.length; i++) {
this.$on(name[i], fn);
}
return;
}
if (this.list[name]) {
this.list[name].push(fn);
} else {
this.list[name] = [fn];
}
},
/**
* 取消订阅
* @param {string|Array<string>|null} name 事件名
* @param {Function|null} fn
* @returns
*/
$off: function (name, fn) {
// 没传入参数,清空所有订阅
if (!name) {
this.list = {};
return;
}
if (Array.isArray(name)) {
for (let i = 0; i < name.length; i++) {
this.$off(name[i], fn);
}
return;
}
const cbs = this.list[name];
// 没有订阅,直接返回
if (!cbs) return;
// 没有传入对应的订阅,清空所有相关订阅
if (!fn) {
this.list[name] = null;
return;
}
// 找到对应的订阅删除
for (let i = 0; i < cbs.length; i++) {
if (cbs[i] === fn || cbs[i].fn === fn) {
cbs.splice(i, 1);
break;
}
}
}
};
event | 用法 |
---|---|
$on | $on(evnet,callback), $on([evnet,evnet2],callback) |
$off | $off(), $off(event), $off(event,callback) |
$once | $once(evnet,callback) |
$emit | $emit(event), $emit(event,[...args]) |
html中使用
// 引入
<script type="module">
import bus from './bus.js';
// 挂载到window上
window.$bus = bus;
</script>
<script>
// 用法
// window.$bus.$on(event,callback), 订阅
// window.$bus.$once(event,callback), 订阅一次后移除订阅
// window.$bus.$off(event,callback), 移除订阅
// window.$bus.$emit(event,[...args]), 发布
</script>
vue2中使用
// main.js中引入
import bus from './bus.js';
// 挂在到原型上,创建事件总线
Vue.prototype.$bus = bus;
// 用法
// this.$bus.$on(event,callback), 订阅
// this.$bus.$once(event,callback), 订阅一次后移除订阅
// this.$bus.$off(event,callback), 移除订阅
// this.$bus.$emit(event,[...args]), 发布
js中订阅发布模式bus的更多相关文章
- js设计模式之代理模式以及订阅发布模式
为啥将两种模式放在一起呢?因为这样文章比较长啊. 写博客的目的我觉得首要目的是整理自己的知识点,进而优化个人所得知识体系.知识成为个人的知识,就在于能够用自己的话表达同一种意义. 本文是设计模式系列文 ...
- Publisher/Subscriber 订阅-发布模式
Publisher/Subscriber 订阅-发布模式 本博后续将陆续整理这些年做的一些预研demo,及一些前沿技术的研究,与大家共研技术,共同进步. 关于发布订阅有很多种实现方式,下面主要介绍WC ...
- AngularJS的简单订阅发布模式例子
控制器之间的交互方式广播 broadcast, 发射 emit 事件 类似于 js中的事件 , 可以自己定义事件 向上传递直到 document 在AngularJs中 向上传递直到 rootScop ...
- 设计模式---订阅发布模式(Subscribe/Publish)
设计模式---订阅发布模式(Subscribe/Publish) 订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象.这个主题对象在自身状态变化时,会通知所有订阅者对象,使 ...
- RabbitMQ下的生产消费者模式与订阅发布模式
所谓模式,就是在某种场景下,一类问题及其解决方案的总结归纳.生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信,以下面两种场景为例: 数据接入 假设 ...
- Kafka下的生产消费者模式与订阅发布模式
原文:https://blog.csdn.net/zwgdft/article/details/54633105 在RabbitMQ下的生产消费者模式与订阅发布模式一文中,笔者以“数据接入”和“事 ...
- saltstack系列(三)——zmq订阅/发布模式
zmq订阅发布模式 server端代码: #coding=utf-8 ''''' 服务端,发布模式 ''' import zmq from random import randrange contex ...
- ionic2踩坑之订阅发布模式的实现
原文地址:http://www.cnblogs.com/eccainiao/p/6429536.html 转载请说明. 在ionic2中实现订阅发布模式,需要用到Events. Events下面有三个 ...
- 订阅发布模式eventEmiter
// 订阅发布模式 class EventEmitter { constructor() { this._events = {}; } on(name, callback) { if (this._e ...
- Java里观察者模式(订阅发布模式)
创建主题(Subject)接口 创建订阅者(Observer)接口 实现主题 实现观察者 测试 总结 在公司开发项目,如果碰到一些在特定条件下触发某些逻辑操作的功能的实现基本上都是用的定时器 比如用户 ...
随机推荐
- Linux常用的20个命令(下)
无论你是后端程序员还是前端程序员,都避免不了和Linux打交道.上篇介绍了Linux常用的20个命令其中的10个,本文继续介绍剩下的10个命令. 11.man 命令 manual的缩写,即使用手册的意 ...
- Java注解--一张图一案例掌握自定义注解
1.概述 是什么:是对方法.类.参数.包.域以及变量等进行代码功能的增强或者修改程序的行为等操作. 应用 跟踪代码依赖性,实现替代配置文件功能 在反射中使用Annotation,字段格式化(如:数据字 ...
- Github 使用PAT(Personal Access Token)后的命令行登录
在Github上启用PAT 命令行下使用git push不能再直接使用用户名密码, 在输入密码的地方需要使用PAT来代替. 具体的创建步骤为 https://docs.github.com/en/gi ...
- Vue+SpringBoot+ElementUI实战学生管理系统-9.教师管理模块
1.章节介绍 前一篇介绍了班级管理模块,这一篇编写教师管理模块,需要的朋友可以拿去自己定制.:) 2.获取源码 源码是捐赠方式获取,详细请QQ联系我 :)! 3.实现效果 教师列表 修改教师 4.模块 ...
- Spring Boot图书管理系统项目实战-2.项目搭建
导航: pre: 1.系统功能和架构介绍 next:3.用户登录 只挑重点的讲,具体的请看项目源码. 1.项目源码: 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.添加依赖 <depe ...
- Nologging到底何时才能生效
转了一篇EYGLE的文章 -------------------------------------------------- 最初的问题是这个帖子: http://www.itpub.net/sho ...
- Apipost参数描述的填写和参数描述库的使用
请求参数的描述填写 对于header.query以及form-data和urlencode的body参数,我们在如下地方填写参数描述: 如图中所示,对于一个填写过的参数,我们可以在新建接口可以通过点击 ...
- 【LeetCode排序专题01】由旋转数组的最小数字引出的关于排序算法的讨论(冒泡排序、二分查找+暴力法)
旋转数组的最小数字 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一 ...
- 在Study.BlazorOne项目中引入Study.Trade模块的实体的表结构
# 1.修改EntityFrameworkCore项目下的BlazorOneDbContext文件,增加一行代码即可 增加Study.Trade.EntityFrameworkCore中的这个方法: ...
- Java纯手打web服务器(三)
概要:考虑到上一篇中的request和response对象的安全性,不允许servlt程序员在service方法中把servletRequest和servletResponse对象进行强转reques ...