原生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在IE和FF下attachEvent,addEventListener学习笔记
Nov 26 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
Nov 27 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
Aug 12 Javascript
分享一则javascript 调试技巧
Jan 02 Javascript
JS中生成随机数的用法及相关函数
Jan 09 Javascript
js省市县三级联动效果实例
Apr 15 Javascript
详细讲解JavaScript中的this绑定
Oct 10 Javascript
jquery.validate.js 多个相同name的处理方式
Jul 10 jQuery
angularjs路由传值$routeParams详解
Sep 05 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
Jun 26 Javascript
JavaScript中如何调用Java方法
Sep 16 Javascript
jquery实现点击左右按钮切换图片
Jan 27 jQuery
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
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
33道php常见面试题及答案
2015/07/06 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
jquery.AutoComplete.js中文修正版(支持firefox)
2010/04/09 Javascript
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
分享一个自己写的table表格排序js插件(高效简洁)
2011/10/29 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
javascript运动详解
2015/07/06 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
Javascript网页抢红包外挂实现分享
2018/01/11 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
vue中的过滤器实例代码详解
2019/06/06 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
[03:40]2014DOTA2国际邀请赛 B神专访:躲箭真的很难
2014/07/13 DOTA
Python新手实现2048小游戏
2015/03/31 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
python 实现return返回多个值
2019/11/19 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
Python爬虫基于lxml解决数据编码乱码问题
2020/07/31 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
露营世界:Camping World
2017/02/02 全球购物
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
高中学生期末评语
2014/04/25 职场文书
团队拓展活动总结
2014/08/27 职场文书
停车场管理制度范本
2015/08/05 职场文书
奖学金申请个人主要事迹材料
2015/11/04 职场文书
社会实践心得体会范文
2016/01/14 职场文书
Python数据类型最全知识总结
2021/05/31 Python
分享几个实用的CSS代码块
2022/06/10 HTML / CSS