亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

原生js實(shí)現(xiàn)的觀察者和訂閱者模式簡(jiǎn)單示例

 更新時(shí)間:2020年04月18日 11:56:41   作者:qdmoment  
這篇文章主要介紹了原生js實(shí)現(xiàn)的觀察者和訂閱者模式,結(jié)合簡(jiǎn)單實(shí)例形式分析了js觀察者和訂閱者模式的相關(guān)原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下

本文實(shí)例講述了原生js實(shí)現(xiàn)的觀察者和訂閱者模式。分享給大家供大家參考,具體如下:

觀察者模式也叫 發(fā)布者-訂閱者模式,發(fā)布者發(fā)布事件,訂閱者監(jiān)聽事件并做出反應(yīng)

在傳統(tǒng)的前端解耦方面,觀察者模式作為比較常見一種設(shè)計(jì)模式,大量使用在各種框架類庫(kù)的設(shè)計(jì)當(dāng)中。

核心代碼:

// 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;

使用:引入全局事件類,或通過(guò)配置webpack將事件類設(shè)置為全局變量

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(() => {
   // 發(fā)布 msg 事件
   console.log(eventProxy)
   eventProxy.trigger('msg', 'end','lll');
  }, 5000);
 }
 render() {
  return (
   <div>我是組件一</div>
  )
 }
}
// componentDidUpdate 方法與上例一致
class Child_2 extends Component{
 state = {
  msg: 'start'
 };
 
 componentDidMount() {
  // 監(jiān)聽 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>
 }
}

參考:淘寶前端團(tuán)隊(duì)技術(shù)庫(kù)

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 前端構(gòu)建工具之gulp的配置與搭建詳解

    前端構(gòu)建工具之gulp的配置與搭建詳解

    gulpjs是一個(gè)前端構(gòu)建工具,與gruntjs相比,gulpjs無(wú)需寫一大堆繁雜的配置參數(shù),API也非常簡(jiǎn)單,學(xué)習(xí)起來(lái)很容易,下面這篇文章主要給大家介紹了關(guān)于前端構(gòu)建工具之gulp的配置與搭建的相關(guān)資料,需要的朋友可以參考下。
    2017-06-06
  • pdfmake生成pdf的使用方法

    pdfmake生成pdf的使用方法

    本文介紹了如何使用pdfmake第三方庫(kù)在項(xiàng)目中根據(jù)模板生成PDF文件,文中還提到了常用的配置,如頁(yè)眉和頁(yè)腳效果,對(duì)pdfmake pdf使用方法感興趣的朋友一起看看吧
    2024-09-09
  • javascript數(shù)組元素刪除方法delete和splice解析

    javascript數(shù)組元素刪除方法delete和splice解析

    這篇文章主要介紹了javascaipt數(shù)組元素刪除方法delete和splice解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 解決循環(huán)中setTimeout執(zhí)行順序的問(wèn)題

    解決循環(huán)中setTimeout執(zhí)行順序的問(wèn)題

    今天小編就為大家分享一篇解決循環(huán)中setTimeout執(zhí)行順序的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • JS二級(jí)菜單不同實(shí)現(xiàn)方法分析【4種方法】

    JS二級(jí)菜單不同實(shí)現(xiàn)方法分析【4種方法】

    這篇文章主要介紹了JS二級(jí)菜單不同實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了4種不同的二級(jí)下拉菜單實(shí)現(xiàn)方法,需要的朋友可以參考下
    2018-12-12
  • 利用Javascript實(shí)現(xiàn)BMI計(jì)算器

    利用Javascript實(shí)現(xiàn)BMI計(jì)算器

    BMI指數(shù)計(jì)算器相信大家都用過(guò),那用JavaScript怎么實(shí)現(xiàn)呢?其實(shí)很簡(jiǎn)單,這篇文章給出了實(shí)例代碼,有需要的可以參考學(xué)習(xí)。
    2016-08-08
  • 微信小程序?qū)崿F(xiàn)文章關(guān)注功能詳細(xì)流程

    微信小程序?qū)崿F(xiàn)文章關(guān)注功能詳細(xì)流程

    在社交小程序里有個(gè)常見的場(chǎng)景是關(guān)注功能,我們本篇以關(guān)注已經(jīng)發(fā)布的文章為例,講解一下關(guān)注功能如何實(shí)現(xiàn)
    2022-08-08
  • JS中跳出循環(huán)的示例代碼

    JS中跳出循環(huán)的示例代碼

    for循環(huán)中我們使用continue;終止本次循環(huán)計(jì)入下一個(gè)循環(huán),使用break終止整個(gè)循環(huán)。下面小編通過(guò)本文給大家分享JS中跳出循環(huán)的示例代碼,需要的朋友參考下吧
    2017-09-09
  • js獲取圖片寬高的方法

    js獲取圖片寬高的方法

    這篇文章主要介紹了js獲取圖片寬高的方法,快速獲取圖片的寬高其實(shí)是為了預(yù)先做好排版樣式布局做準(zhǔn)備,需要的朋友可以參考下
    2015-11-11
  • 關(guān)于this和self的使用說(shuō)明

    關(guān)于this和self的使用說(shuō)明

    剛接觸python的時(shí)候,最不習(xí)慣的事情,就是每個(gè)方法都要加一個(gè)self。無(wú)論Javascript還是C#,都直接一個(gè)this搞定,干嘛非要加一個(gè)變量self。
    2010-08-08

最新評(píng)論