原生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右键菜单效果代码
Jul 21 Javascript
jQuery-serialize()输出序列化form表单值的方法
Dec 26 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
Jun 05 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
Apr 15 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
Aug 24 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
Jan 08 Javascript
javaScript基础详解
Jan 19 Javascript
在 Angular 中实现搜索关键字高亮示例
Mar 21 Javascript
常用的 JS 排序算法 整理版
Apr 05 Javascript
vuex实现像调用模板方法一样调用Mutations方法
Nov 06 Javascript
在vue中使用防抖函数组件操作
Jul 26 Javascript
游戏开发中如何使用CocosCreator进行音效处理
Apr 14 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函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
Joomla简单判断用户是否登录的方法
2016/05/04 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
PHP赋值的内部是如何跑的详解
2019/01/13 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
Vue单文件组件基础模板小结
2017/08/10 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
Python使用pip安装pySerial串口通讯模块
2018/04/20 Python
python3.x实现发送邮件功能
2018/05/22 Python
python微信好友数据分析详解
2018/11/19 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
python标识符命名规范原理解析
2020/01/10 Python
在python tkinter界面中添加按钮的实例
2020/03/04 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
大专生简历的自我评价
2013/11/26 职场文书
工厂搬迁方案
2014/05/11 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
检讨书格式范文
2015/05/07 职场文书
python 利用 PIL 将数组值转成图片的实现
2021/04/12 Python
python文件目录操作之os模块
2021/05/08 Python
MySQL定时备份数据库(全库备份)的实现
2021/09/25 MySQL
解析python中的jsonpath 提取器
2022/01/18 Python
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis