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

三招教你如何解決Vuex數(shù)據(jù)丟失問(wèn)題

 更新時(shí)間:2025年07月01日 09:58:30   作者:江城開(kāi)朗的豌豆  
這篇文章主要為大家詳細(xì)介紹了解決Vuex數(shù)據(jù)丟失問(wèn)題的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下

大家好,我是小楊,一個(gè)經(jīng)歷過(guò)Vuex數(shù)據(jù)"人間蒸發(fā)"慘案的老司機(jī)。上周還在加班趕工,第二天打開(kāi)項(xiàng)目發(fā)現(xiàn)購(gòu)物車(chē)空了?用戶(hù)登錄狀態(tài)丟了?別急!今天就用冰箱存食物的比喻,教你守住Vuex里的每一份數(shù)據(jù)!

(文末附贈(zèng)【防丟代碼套餐】,直接復(fù)制就能用~)

一、數(shù)據(jù)丟失的五大案發(fā)現(xiàn)場(chǎng)

案發(fā)現(xiàn)場(chǎng)1:頁(yè)面刷新 → 冰箱斷電

// store里的數(shù)據(jù)就像斷電后的冰箱
state: {
  cartItems: []  // 刷新后:空!??
}

案發(fā)現(xiàn)場(chǎng)2:瀏覽器隱身模式 → 冰箱沒(méi)插電

// 本地存儲(chǔ)無(wú)法使用
localStorage.getItem('user') // 返回null

案發(fā)現(xiàn)場(chǎng)3:異步操作未完成 → 外賣(mài)還沒(méi)送到就關(guān)冰箱

actions: {
  async fetchUser({ commit }) {
    const user = await 我.調(diào)接口() // 如果刷新頁(yè)面...
    commit('SET_USER', user) // 可能永遠(yuǎn)執(zhí)行不到!
  }
}

案發(fā)現(xiàn)場(chǎng)4:SSR hydration失敗 → 冰箱門(mén)沒(méi)關(guān)嚴(yán)

// 服務(wù)端渲染時(shí),客戶(hù)端初始化狀態(tài)不匹配
window.__INITIAL_STATE__ = {...} // 傳輸過(guò)程中丟失

二、五道防盜門(mén)方案

方案1:本地存儲(chǔ)持久化(給冰箱加發(fā)電機(jī))

// store初始化時(shí)讀取
const user = JSON.parse(localStorage.getItem('user') || 'null')

const store = new Vuex.Store({
  state: { user },
  plugins: [
    store => {
      // 狀態(tài)變化時(shí)自動(dòng)保存
      store.subscribe((mutation, state) => {
        localStorage.setItem('user', JSON.stringify(state.user))
      })
    }
  ]
})

方案2:vuex-persistedstate插件(智能保鮮膜)

npm install vuex-persistedstate
import createPersistedState from 'vuex-persistedstate'

const store = new Vuex.Store({
  plugins: [
    createPersistedState({
      paths: ['user', 'cart'] // 只持久化指定模塊
    })
  ]
})

方案3:會(huì)話管理(臨時(shí)小冰柜)

// 使用sessionStorage替代(標(biāo)簽頁(yè)關(guān)閉時(shí)清除)
createPersistedState({
  storage: window.sessionStorage
})

方案4:防抖保存(省電模式)

let saveTimer
store.subscribe((_, state) => {
  clearTimeout(saveTimer)
  saveTimer = setTimeout(() => {
    localStorage.setItem('store', JSON.stringify(state))
  }, 1000) // 1秒防抖
})

方案5:SSR數(shù)據(jù)脫水/注水(冷鏈運(yùn)輸)

// 服務(wù)端
context.state = store.state

// 客戶(hù)端
if (window.__INITIAL_STATE__) {
  store.replaceState(window.__INITIAL_STATE__)
}

三、實(shí)戰(zhàn)代碼套餐

套餐A:用戶(hù)登錄狀態(tài)保衛(wèi)戰(zhàn)

// store/modules/user.js
export default {
  state: () => ({
    token: null,
    profile: null
  }),
  mutations: {
    LOGIN(state, { token, profile }) {
      state.token = token
      state.profile = profile
      // 同步保存到本地存儲(chǔ)
      localStorage.setItem('auth', JSON.stringify({ token, profile }))
    }
  },
  actions: {
    initAuth({ commit }) {
      const auth = JSON.parse(localStorage.getItem('auth'))
      if (auth) commit('LOGIN', auth)
    }
  }
}

套餐B:購(gòu)物車(chē)數(shù)據(jù)搶救方案

// store/plugins/cartPersistence.js
export default store => {
  // 初始化時(shí)讀取
  const savedCart = localStorage.getItem('cart')
  if (savedCart) {
    store.commit('cart/RESTORE_CART', JSON.parse(savedCart))
  }

  // 監(jiān)聽(tīng)變化
  store.subscribe((mutation, state) => {
    if (mutation.type.startsWith('cart/')) {
      localStorage.setItem('cart', JSON.stringify(state.cart.items))
    }
  })
}

四、避坑指南

1.敏感信息別亂存

  • ? 把用戶(hù)密碼存在localStorage
  • ? 只存token,及時(shí)過(guò)期

2.大體積數(shù)據(jù)要謹(jǐn)慎

// 超過(guò)5MB可能引發(fā)性能問(wèn)題
localStorage.setItem('hugeData', JSON.stringify(bigData))

3.SSR的坑要注意

// 判斷是否客戶(hù)端環(huán)境
if (process.client) {
  const data = localStorage.getItem('data')
}

4.隱私模式兼容方案

try {
  localStorage.setItem('test', 'test')
} catch (e) {
  console.warn('隱私模式禁用本地存儲(chǔ)')
  // 降級(jí)方案:使用內(nèi)存存儲(chǔ)或cookie
}

五、終極解決方案:vuex-persist + 加密

import VuexPersistence from 'vuex-persist'
import SecureLS from 'secure-ls'

const ls = new SecureLS({ isCompression: false })

const vuexLocal = new VuexPersistence({
  storage: {
    getItem: key => ls.get(key),
    setItem: (key, value) => ls.set(key, value),
    removeItem: key => ls.remove(key)
  },
  filter: mutation => 
    !mutation.type.includes('敏感操作')
})

const store = new Vuex.Store({
  plugins: [vuexLocal.plugin]
})

資源大禮包

完整示例項(xiàng)目github.com/xiaoyang/vuex-data-rescue

性能對(duì)比表

方案優(yōu)點(diǎn)缺點(diǎn)
localStorage持久化5MB限制
sessionStorage標(biāo)簽頁(yè)級(jí)隔離關(guān)閉即丟失
IndexedDB大容量API復(fù)雜
Cookies自動(dòng)攜帶4KB限制

?到此這篇關(guān)于三招教你如何解決Vuex數(shù)據(jù)丟失問(wèn)題的文章就介紹到這了,更多相關(guān)Vuex數(shù)據(jù)丟失解決內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

洪洞县| 连州市| 怀远县| 屯昌县| 达孜县| 简阳市| 四会市| 泰宁县| 太仓市| 延边| 南宫市| 泽州县| 青铜峡市| 清原| 塘沽区| 城固县| 淅川县| 南宫市| 达孜县| 泰安市| 藁城市| 团风县| 嘉义县| 平武县| 浮山县| 洞口县| 搜索| 黄冈市| 贺兰县| 桦南县| 千阳县| 芮城县| 新蔡县| 墨竹工卡县| 闻喜县| 双峰县| 灵台县| 鲁山县| 宜宾县| 梁河县| 达日县|