亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

使用vuex緩存數據并優化自己的vuex-cache

2019-11-19 13:45:20
字體:
來源:轉載
供稿:網友

需求:

  1. 請求接口之后,緩存當前接口的數據,下次請求同一接口時拿緩存數據,不再重新請求
  2. 添加緩存失效時間

cache使用map來實現

ES6 模塊與 CommonJS 模塊的差異

  1. CommonJS 模塊輸出的是一個值的拷貝,ES6 模塊輸出的是值的引用。
  2. CommonJS 模塊是運行時加載,ES6 模塊是編譯時輸出接口。

因為esm輸出的是值的引用,直接就是單例模式了

詳細

export let cache = new Cache()

版本1

思路:

  1. 在vuex注冊插件,插件會在每次mutations提交之后,判斷要不要寫入cache
  2. 在提交actions的時候判斷是否有cache,有就拿cache里面的數據,然后把數據commit給mutataios

注意: 在插件里面獲取的mutations-type是包含命名空間的,而在actions里面則是沒有命名空間,需要補全。

/mutation-types.js

/** * 需要緩存的數據會在mutations-type后面添加-CACHED */export const SET_HOME_INDEX = 'SET_HOME_INDEX-CACHED'/modules/home/index.jsconst actions = { /**  * @description 如果有緩存,就返回把緩存的數據,傳入mutations,  * 沒有緩存就從接口拿數據,存入緩存,把數據傳入mutations  */ async fetchAction ({commit}, {mutationType, fetchData, oPayload}) {  // vuex開啟了命名空間,所這里從cachekey要把命名空間前綴 + type + 把payload格式化成JSON  const cacheKey = NAMESPACE + mutationType + JSON.stringify(oPayload)  const cacheResponse = cache.get(cacheKey || '')  if (!cacheResponse) {   const [err, response] = await fetchData()   if (err) {    console.error(err, 'error in fetchAction')    return false   }   commit(mutationType, {response: response, oPayload})  } else {   console.log('已經進入緩存取數據?。?!')   commit(mutationType, {response: cacheResponse, oPayload})  } }, loadHomeData ({ dispatch, commit }) {  dispatch(   'fetchAction',   {    mutationType: SET_HOME_INDEX,    fetchData: api.index,   }  ) }}const mutations = { [SET_HOME_INDEX] (state, {response, oPayload}) {},}const state = { indexData: {}}export default { namespaced: NAMESPACED, actions, state, getters, mutations}

編寫插件,在這里攔截mutations,判斷是否要緩存
/plugin/cache.js

import cache from 'src/store/util/CacheOfStore'// import {strOfPayloadQuery} from 'src/store/util/index'/** * 在每次mutations提交之后,把mutations-type后面有CACHED標志的數據存入緩存, * 現在key值是mutations-type * 問題: * 沒辦法區分不同參數query的請求, * * 方法1: 用每個mutations-type + payload的json格式為key來緩存數據 */function cachePlugin () { return store => {  store.subscribe(({ type, payload }, state) => {   // 需要緩存的數據會在mutations-type后面添加CACHED   const needCache = type.split('-').pop() === 'CACHED'   if (needCache) {    // 這里的type會自動加入命名空間所以 cacheKey = type + 把payload格式化成JSON    const cacheKey = type + JSON.stringify(payload && payload.oPayload)    const cacheResponse = cache.get(cacheKey)    // 如果沒有緩存就存入緩存    if (!cacheResponse) {     cache.set(cacheKey, payload.response)    }   }   console.log(cache)  }) }}const plugin = cachePlugin()export default plugin

store/index.js

import Vue from 'vue'import Vuex from 'vuex'import home from './modules/home'import cachePlugin from './plugins/cache'Vue.use(Vuex)const store = new Vuex.Store({ modules: {  home,  editActivity,  editGuide } plugins: [cachePlugin]})export default store

版本2

思路:直接包裝fetch函數,在里面里面判斷是否需要緩存,緩存是否超時。

優化點:

  1. 把原本分散的cache操作統一放入到fetch
  2. 減少了對命名空間的操作
  3. 添加了緩存有效時間

/actions.js

const actions = { async loadHomeData ({ dispatch, commit }, oPayload) {  commit(SET_HOME_LOADSTATUS)  const [err, response] = await fetchOrCache({   api: api.index,   queryArr: oPayload.queryArr,   mutationType: SET_HOME_INDEX  })  if (err) {   console.log(err, 'loadHomeData error')   return [err, response]  }  commit(SET_HOME_INDEX, { response })  return [err, response] }}

在fetchOrCache判斷是需要緩存,還是請求接口

/** * 用這個函數就說明是需要進入緩存 * @param {*} api 請求的接口 * @param {*} queryArr 請求的參數 * @param {*} mutationType 傳入mutationType作為cache的key值 */export async function fetchOrCache ({api, queryArr, mutationType, diff}) { // 這里是請求接口 const fetch = httpGet(api, queryArr) const cachekey = `${mutationType}:${JSON.stringify(queryArr)}` if (cache.has(cachekey)) {  const obj = cache.get(cachekey)  if (cacheFresh(obj.cacheTimestemp, diff)) {   return cloneDeep(obj)  } else {   // 超時就刪除   cache.delete(cachekey)  } } // 不取緩存的處理 let response = await fetch() // 時間戳綁定在數組的屬性上 response.cacheTimestemp = Date.now() cache.set(cachekey, response) // 返回cloneDeep的對象 return cloneDeep(response)}/** * 判斷緩存是否失效 * @param {*} diff 失效時間差,默認15分鐘=900s */const cacheFresh = (cacheTimestemp, diff = 900) => { if (cacheTimestemp) {  return ((Date.now() - cacheTimestemp) / 1000) <= diff } else {  return true }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美黄网免费在线观看| 国产精品高精视频免费| 一区二区亚洲欧洲国产日韩| 亚洲一区二区黄| 久久久久久综合网天天| 91国产视频在线播放| 欧美国产日韩一区| 色综合久久中文字幕综合网小说| 国产精品私拍pans大尺度在线| 中文字幕国产亚洲2019| 午夜精品久久久久久久99热浪潮| 久久不射热爱视频精品| 国产激情999| 最近中文字幕mv在线一区二区三区四区| 欧美福利视频网站| 亚洲人成网7777777国产| 91豆花精品一区| 中文字幕日韩专区| 亚洲精品乱码久久久久久按摩观| 欧美成人精品激情在线观看| 国产精品免费在线免费| 欧美黑人视频一区| 91中文字幕一区| 一区二区国产精品视频| 97久久久免费福利网址| 色综合久久88色综合天天看泰| 在线播放精品一区二区三区| 欧美电影电视剧在线观看| 国产亚洲精品美女久久久| 91欧美精品成人综合在线观看| 黄色成人在线免费| 国产午夜精品久久久| 狠狠躁夜夜躁久久躁别揉| 国产精品海角社区在线观看| 日韩av在线直播| 乱亲女秽乱长久久久| 日韩美女激情视频| 午夜精品一区二区三区在线视频| 色妞欧美日韩在线| 亚洲第一网站男人都懂| 欧美大肥婆大肥bbbbb| 色综合亚洲精品激情狠狠| 国产精品久久久久久av下载红粉| 亚洲成人三级在线| 欧美激情精品久久久久久久变态| 91精品视频在线看| 欧洲亚洲妇女av| 国产精品18久久久久久麻辣| 亚洲人精品午夜在线观看| 欧美亚洲国产视频小说| 欧美性xxxx极品hd满灌| 亚洲最大的免费| 日韩美女免费线视频| 亚洲第一中文字幕在线观看| 日韩成人久久久| 97久久久久久| 久久精品久久精品亚洲人| 欧美黑人视频一区| 久久精品久久久久久| 成人精品久久一区二区三区| 中文字幕免费精品一区高清| 一本大道亚洲视频| 久久久女人电视剧免费播放下载| 日韩在线欧美在线国产在线| 中文字幕久热精品视频在线| 国产欧美久久一区二区| 茄子视频成人在线| 国产一区玩具在线观看| 欧美日韩另类字幕中文| 亚洲国产精久久久久久久| 亚洲精品v欧美精品v日韩精品| 色婷婷综合久久久久| 亚洲视频在线免费看| 一区二区三区四区精品| 日韩毛片在线看| 91九色国产社区在线观看| 欧美亚洲一区在线| 国内精品久久久久影院 日本资源| 国产精品吊钟奶在线| 国产精品丝袜久久久久久高清| 色婷婷成人综合| 81精品国产乱码久久久久久| 欧美午夜影院在线视频| 欧美猛男性生活免费| 亚洲成人精品视频在线观看| 国产精品第1页| 亚洲黄一区二区| 欧美性猛交xxxxx免费看| 成人在线精品视频| 91精品国产综合久久香蕉的用户体验| 一区二区欧美激情| 亚洲qvod图片区电影| 欧美日韩国产精品| 最近2019年手机中文字幕| 综合激情国产一区| 久久久久久香蕉网| 国产成人综合一区二区三区| 成人激情免费在线| 中文字幕亚洲综合| 久久九九精品99国产精品| 91在线无精精品一区二区| 亚洲人成在线免费观看| 中文字幕一区二区精品| 欧美日韩亚洲视频| 国产剧情久久久久久| 97视频免费在线观看| 国产精品吴梦梦| 色综合亚洲精品激情狠狠| 91av成人在线| 欧美在线观看www| 国产精品国产三级国产专播精品人| 欧美极品美女视频网站在线观看免费| 日韩久久午夜影院| 欧美最猛性xxxxx亚洲精品| 日韩精品免费综合视频在线播放| 亚洲精品不卡在线| 欧美亚洲午夜视频在线观看| 国产欧美最新羞羞视频在线观看| 欧美人与性动交a欧美精品| 久久久久中文字幕2018| 色综久久综合桃花网| 欧美视频一二三| 国产精品扒开腿做爽爽爽的视频| 久久色免费在线视频| 日韩中文综合网| 亚洲国产另类 国产精品国产免费| 久久亚洲精品成人| 日韩成人在线视频网站| 日韩国产高清视频在线| 亚洲人成在线免费观看| 欧洲日韩成人av| 亚洲国产成人爱av在线播放| 成人国产精品一区二区| 在线a欧美视频| 亚洲精品国产精品久久清纯直播| 精品成人国产在线观看男人呻吟| 日本91av在线播放| 97精品国产97久久久久久免费| 欧美大片网站在线观看| 精品久久久香蕉免费精品视频| 国产亚洲精品美女久久久| 亚洲天堂第二页| 精品国产一区二区三区在线观看| 91精品国产91久久久久久| 国产精品久久久久久久久粉嫩av| 97视频在线观看免费高清完整版在线观看| 欧美成年人在线观看| 色综久久综合桃花网| 亚洲自拍欧美另类| 日本欧美中文字幕| 亚洲精品一区中文| 久久久久久久色| 91免费高清视频| 2019中文字幕全在线观看| 欧美国产精品va在线观看| 成人av色在线观看| 亚洲精品久久在线| 色综合久综合久久综合久鬼88| 最近2019中文字幕第三页视频| 国产香蕉精品视频一区二区三区| 国产精品中文字幕久久久| 日韩欧美有码在线| 九九久久精品一区| 欧美成人高清视频|