原生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 CSS修改学习第一章 查找位置
Feb 19 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
Jun 17 Javascript
js中prototype用法详细介绍
Nov 14 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
Sep 03 Javascript
JS实现弹性菜单效果代码
Sep 07 Javascript
vue轮播图插件vue-awesome-swiper
Nov 27 Javascript
Nginx设置为Node.js的前端服务器方法总结
Mar 27 Javascript
使用JQuery自动完成插件Auto Complete详解
Jun 18 jQuery
Vue基础配置讲解
Nov 29 Javascript
Vue常用的全选/反选的示例代码
Feb 19 Javascript
JS算法教程之字符串去重与字符串反转
Dec 15 Javascript
JS中forEach()、map()、every()、some()和filter()的用法
May 11 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实现singleton()单例模式实例
2014/11/06 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
jquery 清空file域示例(兼容个浏览器)
2013/10/11 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
jQuery.cookie.js使用方法及相关参数解释
2017/03/06 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
python中使用%与.format格式化文本方法解析
2017/12/27 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
python-opencv 将连续图片写成视频格式的方法
2019/01/08 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
python itchat给指定联系人发消息的方法
2019/06/11 Python
对Python函数设计规范详解
2019/07/19 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
2020/05/15 Python
python 模拟登陆163邮箱
2020/12/15 Python
腾讯公司的一个sql题
2013/01/22 面试题
安全生产月活动总结
2014/05/04 职场文书
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js
什么是Python装饰器?如何定义和使用?
2022/04/11 Python