(前端)「備忘錄」設計模式在項目開發中的應用

来源:https://www.cnblogs.com/lingda-blogs/archive/2022/08/06/16556254.html
-Advertisement-
Play Games

1. 事件起因 之前做一個駕照考題的項目,有一個這樣的問題,每當我選好了科目和駕照類型後(如圖1),點擊開始考試就會跳到考試頁面(Test.tsx),並且在Test組件中對我架設的中間層發起請求獲取數據(如圖2)。 如果用戶手滑的話不小心點到了左上角的返回,或者狠狠地把屏幕往右滑動一下的話,都會返回 ...


1. 事件起因

  之前做一個駕照考題的項目,有一個這樣的問題,每當我選好了科目和駕照類型後(如圖1),點擊開始考試就會跳到考試頁面(Test.tsx),並且在Test組件中對我架設的中間層發起請求獲取數據(如圖2)。

  如果用戶手滑的話不小心點到了左上角的返回,或者狠狠地把屏幕往右滑動一下的話,都會返回到首頁,再重新點擊開始考試後進入到Test組件內又會重新發送請求獲取隨機題目,重新渲染題目列表,這樣的話比較消耗性能吧,也是用戶不願意看到的。

  

              圖1 

 

                   圖2

 

2. 解決方案

  利用「備忘錄」設計模式。

  實現思路: 備忘錄其實說白了就是做一次緩存,在發起請求之前先判斷緩存中是否有我要請求的數據,如果有就走緩存,如果沒有就重新請求,請求完了之後再把請求到的數據設置進緩存中。

  代碼如下:

  src/QuesMemo/index.ts:

// 封裝一個關於考題的備忘錄類, 實例的cache對象中存放所有關於考題的數據
class QuesMemo {
  cache: any;
  static instance: any;
  constructor() {
    // cache中存放所有緩存的數據
    this.cache = {};
  }

  static getInstance() {
    if(!QuesMemo.instance) {
      Object.defineProperty(QuesMemo, 'instance', {
        value: new QuesMemo()
      });
    }
    return QuesMemo.instance;
  }

  // 將數據增添至信息緩存的方法
  addMemo(key: string, value: Array<any>) {
    this.cache[key] = value;
  }
}



export default QuesMemo.getInstance() as object;

  

  下麵來到Test組件內,在請求之前先判斷下緩存中有沒有我要請求的數據,代碼如下:

  src/views/Test.tsx:

// 這個是自定義的hook, 裡面就是做了請求數據以及拿到數據後設置當前問題curQuestion的操作, 在Test組件內調用這個hook即可
export function useCurQuestion(): [ IQueryData | null, any ] {

  const subject: SUBJECTS = useSelector((state: IState) => state.curSubject);
  const model: MODELS = useSelector((state: IState) => state.model);
  
  const [ curQuestion, setCurQuestion ] = useState<IQueryData>(null);

  const dispatch: Dispatch = useDispatch();


  useEffect(() => {
    // 開始判斷cache緩存中是否有我所需要的考題數據, 考題數據的key我定義為 subject-model 的形式
    if(quesMemo.cache[`${ subject }-${ model }`]) {
      // 如果有考題數據那我就走緩存
      let result: IQueryData[] = quesMemo.cache[ `${ subject }-${ model }` ];
      
      dispatch({ type: types.SET_QUERY_LIST, payload: result });
      setCurQuestion(result[0]);      // 重新進入Test從第一題開始答
    }else {
      // getQueries是向node中間層發起請求獲取數據哈
      getQueries({ subject, model }).then(res => {
        console.log('res: ', res);
        dispatch({ type: types.SET_QUERY_LIST, payload: res.result });
        setCurQuestion(res.result[0]);
  
        // 獲取到了新數據後再把數據丟入緩存
        quesMemo.addMemo( `${ subject }-${ model }`, res.result );
      });
    }
  
  }, [ subject, model, dispatch ]);

  return [ curQuestion, setCurQuestion ];
}

 

  以上就是備忘錄設計模式的大致使用了,感覺思路挺簡單的,就是做了一次緩存,請求之前判斷有數據就走緩存,沒數據就重新請求再丟進緩存。

 

  參考書籍 《JavaScript設計模式》 張容銘 著

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 慢查詢日誌預設不開啟,建議手動開啟,方便我們定位線上問題。 執行時間超過閾值的SQL會被寫入到慢查詢日誌當中,這樣可以幫助我們記錄執行時間過長的SQL語句,定位線上慢SQL問題,方便我們進行SQL性能調優。 ...
  • 金融行業作為國民經濟的命脈和樞紐,對底層資料庫的能力要求在不斷提高。具有高性能、可擴展、高可用等特性的分散式資料庫是金融行業數字化轉型的重要支撐。 金融企業如何在不同的應用場景下,做好分散式資料庫的選型和落地呢?本文從業務、技術、行業角度出發,從市場發展到落地實踐,全方位全流程為您剖析分散式資料庫在 ...
  • ARPU如何提升?付費率如何提升?活動ROI如何提升?這些都是游戲運營人員較常遇到的難題。華為分析與聯運活動可以幫助運營提升這些用戶付費指標,通過對玩家打標簽和用戶畫像,對目標群體的進行精準推送,實現對特定用戶進行特定“刺激”,讓他們提高游戲打開率,從而提高游戲的總體付費。 華為分析&聯運活動提升付 ...
  • 1 watch偵聽器 watch 需要偵聽特定的數據源,併在單獨的回調函數中執行副作用 watch第一個參數監聽源 watch第二個參數回調函數cb(newVal,oldVal) watch第三個參數一個options配置項是一個對 { immediate:true //是否立即調用一次 deep: ...
  • 百科簡介 層疊樣式表 (英文全稱:Cascading Style Sheets)是一種用來表現 HTML ( 標準通用標記語言 的一個應用)或 XML (標準通用標記語言的一個子集)等文件樣式的電腦語言。 CSS不僅可以靜態地修飾網頁,還可以配合各種腳本語言動態地對網頁各元素進行格式化。 1. C ...
  • 我們在上文的基礎上,繼續學習 條件判斷:v-if、v-show >作用:用於控制元素的顯示 > 區別: v-if:不渲染DOM,前端頁面看不到標簽,更節省性能(常用) v-show:渲染DOM。將元素設置為display:none 我們看如下代碼,將他們都取值為true時,表示顯示 <templat ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 在javascript中使用Three.js設計並且實現3D場景是一個很有意思的事情,因為在瀏覽器中就能夠渲染出3D場景,非常簡單和輕便。接下來就總結以下我學習Three.js過程中的心得。 1 建立基本場景 在Three.js中有三要素 ...
  • 安裝 首先需要安裝好NPM,然後使用下列的命令一次進行 npm install -g @vue/cli //安裝腳手架 vue create xx //創建Vue項目,xx為要創建的項目名 創建項目後,使用 cd 進入目錄 npm run serve //啟動項目 目錄 Pubulic:靜態文件 s ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...