原生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 相关文章推荐
javascript iframe内的函数调用实现方法
Jul 19 Javascript
同域jQuery(跨)iframe操作DOM(实例讲解)
Dec 19 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
Jun 22 Javascript
node.js中的buffer.copy方法使用说明
Dec 14 Javascript
js实现鼠标划过给div加透明度的方法
May 25 Javascript
jquery性能优化高级技巧
Aug 24 Javascript
Jquery组件easyUi实现表单验证示例
Aug 23 Javascript
轻松掌握JavaScript代理模式
Aug 26 Javascript
Vue.js使用v-show和v-if的注意事项
Dec 13 Javascript
JS html时钟制作代码分享
Mar 03 Javascript
Node.js使用gm拼装sprite图片
Jul 04 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
Nov 12 Javascript
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面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
php将数组转换成csv格式文件输出的方法
2015/03/14 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
将PHP的session数据存储到数据库中的代码实例
2016/06/24 PHP
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
Vue自定义指令使用方法详解
2017/08/21 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
Python中使用item()方法遍历字典的例子
2014/08/26 Python
python创建临时文件夹的方法
2015/07/06 Python
Python机器学习之决策树算法实例详解
2017/12/06 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
python使用Matplotlib绘制分段函数
2018/09/25 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
python统计字符的个数代码实例
2020/02/07 Python
CSS3弹性盒模型开发笔记(二)
2016/04/26 HTML / CSS
解锁canvas导出图片跨域的N种姿势小结
2019/01/24 HTML / CSS
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
计算机专业学生求职信分享
2013/12/15 职场文书
关于安全的演讲稿
2014/05/09 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
争做文明公民倡议书
2014/08/29 职场文书
平安家庭事迹材料
2014/12/20 职场文书
教务处教学工作总结
2015/08/10 职场文书