原生js实现的观察者和订阅者模式简单示例


Posted in Javascript onApril 18, 2020

本文实例讲述了原生js实现的观察者和订阅者模式。分享给大家供大家参考,具体如下:

观察者模式也叫 发布者-订阅者模式,发布者发布事件,订阅者监听事件并做出反应

在传统的前端解耦方面,观察者模式作为比较常见一种设计模式,大量使用在各种框架类库的设计当中。

核心代码:

// eventProxy.js
'use strict';
const eventProxy = {
 onObj: {},
 oneObj: {},
 on: function(key, fn) {
  if(this.onObj[key] === undefined) {
   this.onObj[key] = [];
  }
 
  this.onObj[key].push(fn);
 },
 one: function(key, fn) {
  if(this.oneObj[key] === undefined) {
   this.oneObj[key] = [];
  }
 
  this.oneObj[key].push(fn);
 },
 off: function(key) {
  this.onObj[key] = [];
  this.oneObj[key] = [];
 },
 trigger: function() {
  let key, args;
  if(arguments.length == 0) {
   return false;
  }
  key = arguments[0];
  args = [].concat(Array.prototype.slice.call(arguments, 1));
 
  if(this.onObj[key] !== undefined
   && this.onObj[key].length > 0) {
   for(let i in this.onObj[key]) {
    this.onObj[key][i].apply(null, args);
   }
  }
  if(this.oneObj[key] !== undefined
   && this.oneObj[key].length > 0) {
   for(let i in this.oneObj[key]) {
    this.oneObj[key][i].apply(null, args);
    this.oneObj[key][i] = undefined;
   }
   this.oneObj[key] = [];
  }
 }
};
 
export default eventProxy;

使用:引入全局事件类,或通过配置webpack将事件类设置为全局变量

import { eventProxy } from '@/utils'
 
class Parent extends Component{
 render() {
  return (
   <div style={{marginTop:"50px"}}>
    <Child_1/>
    <Child_2/>
   </div>
  );
 }
}
// componentDidUpdate 与 render 方法与上例一致
class Child_1 extends Component{
 componentDidMount() {
  setTimeout(() => {
   // 发布 msg 事件
   console.log(eventProxy)
   eventProxy.trigger('msg', 'end','lll');
  }, 5000);
 }
 render() {
  return (
   <div>我是组件一</div>
  )
 }
}
// componentDidUpdate 方法与上例一致
class Child_2 extends Component{
 state = {
  msg: 'start'
 };
 
 componentDidMount() {
  // 监听 msg 事件
  eventProxy.on('msg', (msg,mm) => {
   console.log(msg,mm)
   this.setState({
    msg:msg
   });
  });
 }
 
 render() {
  return <div>
   <p>child_2 component: {this.state.msg}</p>
  </div>
 }
}

参考:淘宝前端团队技术库

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
Aug 13 Javascript
JS event使用方法详解
Apr 28 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
May 09 Javascript
JS函数多个参数默认值指定方法分析
Nov 28 Javascript
JS实现汉字与Unicode码相互转换的方法详解
Apr 28 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
Jun 12 jQuery
用图片替换checkbox原始样式并实现同样的功能
Nov 15 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
Apr 26 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
Dec 27 Javascript
javascript实现简易数码时钟
Mar 30 Javascript
Js on及addEventListener原理用法区别解析
Jul 11 Javascript
vue ant design 封装弹窗表单的使用
Jun 01 Vue.js
es6函数name属性功能与用法实例分析
Apr 18 #Javascript
es6数组includes()用法实例分析
Apr 18 #Javascript
es6数组的flat(),flatMap()函数用法实例分析
Apr 18 #Javascript
es6函数中的作用域实例分析
Apr 18 #Javascript
es6函数之rest参数用法实例分析
Apr 18 #Javascript
vue实现短信验证码输入框
Apr 17 #Javascript
JS监听组合按键思路及实现过程
Apr 17 #Javascript
You might like
php 求质素(素数) 的实现代码
2011/04/12 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
js下用gb2312编码解码实现方法
2009/12/31 Javascript
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
IE6 fixed的完美解决方案
2011/03/31 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
JavaScript几种数组去掉重复值的方法推荐
2016/04/12 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
Bootstrap select实现下拉框多选效果
2016/12/23 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
Vue开发实现吸顶效果的示例代码
2018/08/21 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
python爬虫之BeautifulSoup 使用select方法详解
2017/10/23 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
Python处理菜单消息操作示例【基于win32ui模块】
2018/05/09 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
Python 爬虫性能相关总结
2020/08/03 Python
Python如何把字典写入到CSV文件的方法示例
2020/08/23 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
护士个人简历自荐信
2013/10/18 职场文书
理财投资建议书
2014/03/12 职场文书
小学生环保标语
2014/06/13 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB