原生js实现的观察者和订阅者模式简单示例
本文实例讲述了原生js实现的观察者和订阅者模式。分享给大家供大家参考,具体如下:
观察者模式也叫发布者-订阅者模式,发布者发布事件,订阅者监听事件并做出反应
在传统的前端解耦方面,观察者模式作为比较常见一种设计模式,大量使用在各种框架类库的设计当中。
核心代码:
//eventProxy.js 'usestrict'; consteventProxy={ 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(){ letkey,args; if(arguments.length==0){ returnfalse; } key=arguments[0]; args=[].concat(Array.prototype.slice.call(arguments,1)); if(this.onObj[key]!==undefined &&this.onObj[key].length>0){ for(letiinthis.onObj[key]){ this.onObj[key][i].apply(null,args); } } if(this.oneObj[key]!==undefined &&this.oneObj[key].length>0){ for(letiinthis.oneObj[key]){ this.oneObj[key][i].apply(null,args); this.oneObj[key][i]=undefined; } this.oneObj[key]=[]; } } }; exportdefaulteventProxy;
使用:引入全局事件类,或通过配置webpack将事件类设置为全局变量
import{eventProxy}from'@/utils' classParentextendsComponent{ render(){ return(
我是组件一
)
}
}
//componentDidUpdate方法与上例一致
classChild_2extendsComponent{
state={
msg:'start'
};
componentDidMount(){
//监听msg事件
eventProxy.on('msg',(msg,mm)=>{
console.log(msg,mm)
this.setState({
msg:msg
});
});
}
render(){
returnchild_2component:{this.state.msg}
参考:淘宝前端团队技术库
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。