<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      喝杯茶先~

      導航

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

      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設計模式》 張容銘 著

       

      posted on 2022-08-06 00:05  紅果園園長  閱讀(565)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 亚洲鸥美日韩精品久久| 一区二区三区鲁丝不卡| 40岁成熟女人牲交片20分钟| 成人亚洲a片v一区二区三区动漫| 亚洲av永久无码精品网站| 免费三级网站| 日韩精品国内国产一区二| 国产欧美综合在线观看第十页| 亚洲一区在线成人av| 欧美国产日韩久久mv| 丰满少妇69激情啪啪无| 四虎成人在线观看免费| 精品国产伦理国产无遮挡| 风韵丰满熟妇啪啪区老老熟妇 | 国产精品香港三级国产av| 亚洲国产成人va在线观看天堂| 亚洲中文字幕五月五月婷| 女人香蕉久久毛毛片精品| 亚洲人成色99999在线观看| 国产成人精彩在线视频| 全部免费毛片在线播放| 开心婷婷五月激情综合社区| 久久国产一区二区三区| 999福利激情视频| 在线精品亚洲区一区二区| 上司人妻互换中文字幕| 亚洲老熟女一区二区三区| 中文字幕日韩视频欧美一区| 亚洲精品一区二区区别| 高清国产亚洲精品自在久久| 国产精品无码专区| 午夜亚洲国产理论片亚洲2020| 白嫩少妇激情无码| 色伦专区97中文字幕| 波多结野衣一区二区三区| 久久国产精品久久久久久| 日韩人妻少妇一区二区三区| 亚洲成a人在线播放www| 久久久久青草线蕉亚洲| 久热这里只有精品12| 亚洲精品宾馆在线精品酒店|