原生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判断用户浏览器是否是XP SP2的IE6
Mar 08 Javascript
javascript 树控件 比较好用
Jun 11 Javascript
js中关于一个分号的崩溃示例
Nov 11 Javascript
js 剪切板应用clipboardData详细解析
Dec 17 Javascript
js中opener与parent的区别详细解析
Jan 14 Javascript
详解JavaScript基于面向对象之创建对象(1)
Dec 10 Javascript
AngularJS constant和value区别详解
Feb 28 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
Apr 25 Javascript
mongoose中利用populate处理嵌套的方法
May 26 Javascript
vue webpack打包优化操作技巧
Feb 22 Javascript
详解vue 单页应用(spa)前端路由实现原理
Apr 04 Javascript
vue 利用路由守卫判断是否登录的方法
Sep 29 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 模拟POST|GET操作实现代码
2010/07/20 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
PHP获得数组交集与差集的方法
2015/06/10 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
PHP7 mongoDB扩展使用的方法分享
2019/05/02 PHP
Javascript 函数对象的多重身份
2009/06/28 Javascript
JQuery 常用方法和事件详细介绍
2013/04/18 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
微信小程序实现的自定义分享功能示例
2019/02/12 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
Python中的条件判断语句基础学习教程
2016/02/07 Python
常用python编程模板汇总
2016/02/12 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
python3 http提交json参数并获取返回值的方法
2018/12/19 Python
python绘制评估优化算法性能的测试函数
2019/06/25 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
使用Python pip怎么升级pip
2020/08/11 Python
四年的个人工作自我评价
2013/12/10 职场文书
安全生产检查通报
2014/01/29 职场文书
吃空饷专项治理工作实施方案
2014/03/04 职场文书
物流管理专业自荐信
2014/06/23 职场文书
服务标语口号
2014/07/01 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
政协工作总结2015
2015/05/20 职场文书
实习单位意见
2015/06/04 职场文书
2016年员工政治思想表现评语
2015/12/02 职场文书
检讨书怎么写?
2019/06/21 职场文书