欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

原生js實現的觀察者和訂閱者模式簡單示例

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

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

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

在傳統(tǒ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;

使用:引入全局事件類,或通過配置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(() => {
   // 發(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>
 }
}

參考:淘寶前端團隊技術庫

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

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結

希望本文所述對大家JavaScript程序設計有所幫助。

相關文章

  • 前端構建工具之gulp的配置與搭建詳解

    前端構建工具之gulp的配置與搭建詳解

    gulpjs是一個前端構建工具,與gruntjs相比,gulpjs無需寫一大堆繁雜的配置參數,API也非常簡單,學習起來很容易,下面這篇文章主要給大家介紹了關于前端構建工具之gulp的配置與搭建的相關資料,需要的朋友可以參考下。
    2017-06-06
  • pdfmake生成pdf的使用方法

    pdfmake生成pdf的使用方法

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

    javascript數組元素刪除方法delete和splice解析

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

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

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

    JS二級菜單不同實現方法分析【4種方法】

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

    利用Javascript實現BMI計算器

    BMI指數計算器相信大家都用過,那用JavaScript怎么實現呢?其實很簡單,這篇文章給出了實例代碼,有需要的可以參考學習。
    2016-08-08
  • 微信小程序實現文章關注功能詳細流程

    微信小程序實現文章關注功能詳細流程

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

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

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

    js獲取圖片寬高的方法

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

    關于this和self的使用說明

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

最新評論