原生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效率调优经验
Jun 04 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
Feb 26 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
Sep 01 Javascript
JavaScript中子对象访问父对象的方式详解
Sep 01 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
Nov 09 Javascript
JS高级运动实例分析
Dec 20 Javascript
浅谈原型对象的常用开发模式
Jul 22 Javascript
jQuery 导航自动跟随滚动的实现代码
May 30 jQuery
Vue CLI3 开启gzip压缩文件的方式
Sep 30 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
Mar 01 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
Jul 24 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
Aug 27 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 三元运算符实例详细介绍
2016/12/15 PHP
HTML node相关的一些资料整理
2010/01/01 Javascript
javascript中的new使用
2010/03/20 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
python正则匹配查询港澳通行证办理进度示例分享
2013/12/27 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
Python get获取页面cookie代码实例
2018/09/12 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
python scatter函数用法实例详解
2020/02/11 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
校班主任推荐信范文
2013/12/03 职场文书
餐厅筹备计划书
2014/04/25 职场文书
团日活动总结报告
2014/06/25 职场文书
公积金接收函格式
2015/01/30 职场文书
关于长城的导游词
2015/01/30 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
导游词之长城八达岭
2019/09/24 职场文书
nginx配置限速限流基于内置模块
2022/05/02 Servers