原生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 跳转页面延迟2种方法
Mar 29 Javascript
js数组操作学习总结
Nov 04 Javascript
javascript实现滑动解锁功能
Dec 31 Javascript
原生js实现移动开发轮播图、相册滑动特效
Apr 17 Javascript
jQuery菜单插件用法实例
Jul 25 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
May 27 Javascript
第九篇Bootstrap导航菜单创建步骤详解
Jun 21 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
Dec 21 Javascript
JavaScript实现微信红包算法及问题解决方法
Apr 26 Javascript
更优雅的微信小程序骨架屏实现详解
Aug 07 Javascript
js实现圆形菜单选择器
Dec 03 Javascript
详解实现vue的数据响应式原理
Jan 20 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 EOT定界符的使用详解
2008/09/30 PHP
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
2014/06/24 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
jQuery 表格插件整理
2010/04/27 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
iframe子页面与父页面在同域或不同域下的js通信
2014/05/07 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
2017/09/04 Javascript
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
[02:36]DOTA2混沌骑士 英雄基础教程
2013/11/26 DOTA
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
Django接受前端数据的几种方法总结
2016/11/04 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
基于python中theano库的线性回归
2018/08/31 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
浅谈tensorflow 中tf.concat()的使用
2020/02/07 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
新东网科技Java笔试题
2012/07/13 面试题
环境工程毕业生自荐信
2013/11/17 职场文书
保护环境倡议书300字
2014/05/19 职场文书
五一劳动节慰问信
2015/02/14 职场文书
2015年法院工作总结范文
2015/04/28 职场文书
Python机器学习应用之基于线性判别模型的分类篇详解
2022/01/18 Python