最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用vuex緩存數(shù)據(jù)并優(yōu)化自己的vuex-cache

 更新時間:2018年05月30日 10:06:28   作者:lujs  
這篇文章主要介紹了使用vuex緩存數(shù)據(jù)并優(yōu)化自己的vuex-cache,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

需求:

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

cache使用map來實現(xiàn)

ES6 模塊與 CommonJS 模塊的差異

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

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

詳細

export let cache = new Cache()

版本1

思路:

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

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

/mutation-types.js

/**
 * 需要緩存的數(shù)據(jù)會在mutations-type后面添加-CACHED
 */
export const SET_HOME_INDEX = 'SET_HOME_INDEX-CACHED'
/modules/home/index.js


const actions = {
 /**
  * @description 如果有緩存,就返回把緩存的數(shù)據(jù),傳入mutations,
  * 沒有緩存就從接口拿數(shù)據(jù),存入緩存,把數(shù)據(jù)傳入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('已經(jīng)進入緩存取數(shù)據(jù)?。?!')
   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標志的數(shù)據(jù)存入緩存,
 * 現(xiàn)在key值是mutations-type
 * 問題:
 * 沒辦法區(qū)分不同參數(shù)query的請求,
 *
 * 方法1: 用每個mutations-type + payload的json格式為key來緩存數(shù)據(jù)
 */
function cachePlugin () {
 return store => {
  store.subscribe(({ type, payload }, state) => {
   // 需要緩存的數(shù)據(jù)會在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函數(shù),在里面里面判斷是否需要緩存,緩存是否超時。

優(yōu)化點:

  1. 把原本分散的cache操作統(tǒng)一放入到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判斷是需要緩存,還是請求接口

/**
 * 用這個函數(shù)就說明是需要進入緩存
 * @param {*} api 請求的接口
 * @param {*} queryArr 請求的參數(shù)
 * @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()
 // 時間戳綁定在數(shù)組的屬性上
 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
 }
}

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

相關文章

  • vue中的Key值重復問題

    vue中的Key值重復問題

    這篇文章主要介紹了vue中的Key值重復問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 基于Vue實現(xiàn)圖片在指定區(qū)域內移動的思路詳解

    基于Vue實現(xiàn)圖片在指定區(qū)域內移動的思路詳解

    這篇文章主要介紹了基于Vue實現(xiàn)圖片在指定區(qū)域內移動,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • vue如何根據(jù)條件判斷按鈕是否可以點擊

    vue如何根據(jù)條件判斷按鈕是否可以點擊

    這篇文章主要介紹了vue如何根據(jù)條件判斷按鈕是否可以點擊,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue3.x中useRouter()執(zhí)行后返回值是undefined問題解決

    vue3.x中useRouter()執(zhí)行后返回值是undefined問題解決

    這篇文章主要給大家介紹了關于vue3.x中useRouter()執(zhí)行后返回值是undefined問題的解決方法,文中通過代碼示例介紹的非常詳細,對大家學習或者使用vue3.x具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • vue3.0翻牌數(shù)字組件使用方法詳解

    vue3.0翻牌數(shù)字組件使用方法詳解

    這篇文章主要為大家詳細介紹了vue3.0翻牌數(shù)字組件使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue之保留小數(shù)點兩位小數(shù) 使用filters(過濾器)

    vue之保留小數(shù)點兩位小數(shù) 使用filters(過濾器)

    這篇文章主要介紹了vue之保留小數(shù)點兩位小數(shù) 使用filters(過濾器),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 詳解webpack打包vue項目之后生成的dist文件該怎么啟動運行

    詳解webpack打包vue項目之后生成的dist文件該怎么啟動運行

    這篇文章主要介紹了詳解webpack打包vue項目之后生成的dist文件該怎么啟動運行,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Vue項目中使用setTimeout存在的潛在問題及解決

    Vue項目中使用setTimeout存在的潛在問題及解決

    這篇文章主要介紹了Vue項目中使用setTimeout存在的潛在問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 一個手寫的vue放大鏡效果

    一個手寫的vue放大鏡效果

    這篇文章主要介紹了一個手寫的vue放大鏡,組件使用less,文中給出了示例代碼,需要的朋友可以參考下
    2019-08-08
  • Vue做一個簡單的隨機點名冊

    Vue做一個簡單的隨機點名冊

    這篇文章主要介紹的是如何用Vue做一個簡單的隨機點名冊,主要是做個簡單的點名器,不做樣式,需要的朋友可以參考一下,希望對你有所幫助
    2021-12-12

最新評論

临武县| 临颍县| 辽源市| 墨玉县| 华蓥市| 万源市| 龙陵县| 黔南| 安义县| 梁河县| 芷江| 泸定县| 洛宁县| 镇雄县| 舒城县| 衡山县| 郑州市| 枣强县| 桐乡市| 东辽县| 吐鲁番市| 南丰县| 乐昌市| 焦作市| 高青县| 鄂托克前旗| 图们市| 册亨县| 朔州市| 蚌埠市| 高邑县| 中西区| 大丰市| 丹东市| 甘泉县| 怀来县| 新乡市| 高平市| 普安县| 承德市| 沁源县|