原生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 相关文章推荐
jquery1.4后 jqDrag 拖动 不可用
Feb 06 Javascript
jquery中选择块并改变属性值的方法
Jul 31 Javascript
jquery手风琴特效插件
Feb 04 Javascript
js禁止页面刷新与后退的方法
Jun 08 Javascript
浅谈关于JavaScript API设计的一些建议和准则
Jun 24 Javascript
AngularJs学习第八篇 过滤器filter创建
Jun 08 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
May 03 Javascript
vue.js的安装方法
May 12 Javascript
input输入框内容实时监测(附代码)
Aug 15 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
Jul 03 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
Apr 20 Javascript
基于JS实现简单滑块拼图游戏
Oct 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
Zend 输出产生XML解析错误
2009/03/03 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
PHP mkdir()无写权限的问题解决方法
2014/06/19 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
ThinkPHP中html:list标签用法分析
2016/01/09 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
jQuery 阴影插件代码分享
2012/01/09 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
关于js原型的面试题讲解
2016/09/25 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
对vue里函数的调用顺序介绍
2018/03/17 Javascript
react实现点击选中的li高亮的示例代码
2018/05/24 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
Python中的lstrip()方法使用简介
2015/05/19 Python
django实现用户登陆功能详解
2017/12/11 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
django和flask哪个值得研究学习
2020/07/31 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
戴尔英国官网:Dell英国
2017/05/27 全球购物
学前教育毕业生自荐信
2013/10/29 职场文书
2013的个人自我评价
2013/12/26 职场文书
评先进个人材料
2014/12/29 职场文书
2015年三万活动总结
2015/03/25 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书