react 建立單例組件

需求背景

最近有個需求,須要在項目中添加一個消息通知彈窗,告知用戶一些信息。
用戶看過消息後,就再也不彈窗了。javascript

問題

很明顯,這個須要後端的介入,提供相應的接口(這樣可擴展性更好)。java

在開發過程當中,遇到個問題:因爲咱們的系統是多頁面的,因此每次切換頁面,都會去請求後端的消息接口。。有必定的性能損耗。node

由於是多頁面系統,使用單例組件貌似也沒啥意義(不過是個機會學習學習單例組件是怎麼寫的)。
因而,想到使用瀏覽器緩存來記錄是否彈過窗了(固然,得設定過時時間)。react

如何寫單例組件

一、工具函數:後端

import ReactDOM from 'react-dom';

/**
 * ReactDOM 不推薦直接向 document.body mount 元素
 * 當 node 不存在時,建立一個 div
 */
function domRender(reactElem, node) {
  let div;
  if (node) {
    div = typeof node === 'string'
      ? window.document.getElementById(node)
      : node;
  } else {
    div = window.document.createElement('div');
    window.document.body.appendChild(div);
  }
  return ReactDOM.render(reactElem, div);
}

二、組件:瀏覽器

export class SingletonLoading extends Component {
  globalLoadingCount = 0;
  pageLoadingCount = 0;

  state = {
    show: false,
    className: '',
    isGlobal: undefined
  }

  delayTimer = null;

  start = (options = {}) => {
    // ...
  }

  stop = (options = {}) => {
    // ...
  }

  stopAll() {
    if (!this.state.show) return;
    this.globalLoadingCount = 0;
    this.pageLoadingCount = 0;
    this.setState({show: false});
  }

  get isGlobalLoading() {
    return this.state.isGlobal && this.state.show;
  }

  get noWaiting() {
    return this.noGlobalWaiting && this.pageLoadingCount < 1;
  }

  get toPageLoading() {
    return this.noGlobalWaiting && this.isGlobalLoading;
  }

  get noGlobalWaiting() {
    return this.globalLoadingCount < 1;
  }

  render() {
    return <BreakLoading {...this.state} />;
  }
}

// 使用上面的工具函數
export const loading = domRender(<SingletonLoading />);

三、使用組件:緩存

import loading from 'xxx';

// ...
loading.start();
loading.stop();
相關文章
相關標籤/搜索