亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

頁(yè)面刷新后Vuex狀態(tài)丟失的完整解決方案

 更新時(shí)間:2025年04月10日 08:48:35   作者:北辰alk  
當(dāng)頁(yè)面刷新時(shí),Vuex?的?state?數(shù)據(jù)會(huì)丟失,這是因?yàn)?Vuex?的狀態(tài)存儲(chǔ)在內(nèi)存中,刷新瀏覽器會(huì)重置?JavaScript?的運(yùn)行環(huán)境,下面我將詳細(xì)介紹幾種解決方案,從簡(jiǎn)單到復(fù)雜,幫助你根據(jù)項(xiàng)目需求選擇最適合的方法,需要的朋友可以參考下

一、使用瀏覽器本地存儲(chǔ)(localStorage/sessionStorage)

1.1 基礎(chǔ)實(shí)現(xiàn)方案

原理:在 state 變化時(shí)將數(shù)據(jù)存入 localStorage,初始化時(shí)讀取

// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    // 從 localStorage 初始化狀態(tài)
    user: JSON.parse(localStorage.getItem('user') || null,
    settings: JSON.parse(localStorage.getItem('settings')) || {}
  },
  mutations: {
    setUser(state, user) {
      state.user = user
      // 狀態(tài)變化時(shí)保存到 localStorage
      localStorage.setItem('user', JSON.stringify(user))
    },
    updateSettings(state, settings) {
      state.settings = settings
      localStorage.setItem('settings', JSON.stringify(settings))
    }
  }
})

export default store

優(yōu)點(diǎn)

  • 實(shí)現(xiàn)簡(jiǎn)單直接
  • 不需要額外依賴

缺點(diǎn)

  • 需要手動(dòng)管理每個(gè)狀態(tài)的持久化
  • 代碼重復(fù)度高

1.2 自動(dòng)持久化方案

通過(guò) Vuex 的插件機(jī)制自動(dòng)保存所有狀態(tài):

const localStoragePlugin = store => {
  // 初始化時(shí)從 localStorage 恢復(fù)狀態(tài)
  if (localStorage.getItem('vuex')) {
    store.replaceState(
      Object.assign({}, store.state, JSON.parse(localStorage.getItem('vuex')))
    )
  }
  
  // 訂閱 store 變化
  store.subscribe((mutation, state) => {
    // 每次 mutation 后保存整個(gè)狀態(tài)
    localStorage.setItem('vuex', JSON.stringify(state))
  })
}

const store = new Vuex.Store({
  // ...state, mutations, actions 等
  plugins: [localStoragePlugin]
})

優(yōu)化點(diǎn)

  • 可以只持久化特定模塊的狀態(tài)
  • 添加防抖避免頻繁寫入
const persistState = debounce((state) => {
  const persistData = {
    auth: state.auth,  // 只持久化 auth 模塊
    user: state.user   // 和 user 狀態(tài)
  }
  localStorage.setItem('vuex', JSON.stringify(persistData))
}, 1000)

二、使用 vuex-persistedstate 插件

2.1 基本使用

這是一個(gè)專門為 Vuex 設(shè)計(jì)的持久化插件:

npm install vuex-persistedstate
# 或
yarn add vuex-persistedstate
import createPersistedState from 'vuex-persistedstate'

const store = new Vuex.Store({
  // ...
  plugins: [
    createPersistedState()
  ]
})

2.2 高級(jí)配置

createPersistedState({
  key: 'my-vuex-storage',       // 存儲(chǔ)鍵名,默認(rèn)是 'vuex'
  storage: window.sessionStorage, // 可替換為 sessionStorage
  paths: [                     // 指定要持久化的狀態(tài)路徑
    'user',
    'settings.theme'
  ],
  reducer: (state) => {        // 自定義過(guò)濾函數(shù)
    return {
      auth: state.auth,
      project: state.project.currentProject
    }
  }
})

插件特點(diǎn)

  • 支持多種存儲(chǔ)方式(localStorage, sessionStorage, cookies)
  • 可以指定持久化的狀態(tài)路徑
  • 支持自定義序列化方法
  • 默認(rèn)使用防抖優(yōu)化性能

三、使用 IndexedDB 存儲(chǔ)大量數(shù)據(jù)

當(dāng)需要存儲(chǔ)大量數(shù)據(jù)時(shí),localStorage 的容量限制(通常 5MB)可能不夠,可以使用 IndexedDB:

3.1 使用 localForage 庫(kù)

npm install localforage
import localforage from 'localforage'
import { extendPrototype } from 'localforage-vuex'

// 擴(kuò)展 Vuex.Store
extendPrototype(Vuex.Store)

const store = new Vuex.Store({
  // ...
  plugins: [
    localforage.createStore({
      driver: localforage.INDEXEDDB,
      name: 'my-app',
      storeName: 'vuex_persist'
    })
  ]
})

3.2 自定義 IndexedDB 實(shí)現(xiàn)

function indexedDBPlugin() {
  return store => {
    const request = indexedDB.open('vuex-store', 1)
    
    request.onupgradeneeded = event => {
      const db = event.target.result
      if (!db.objectStoreNames.contains('state')) {
        db.createObjectStore('state')
      }
    }
    
    request.onsuccess = event => {
      const db = event.target.result
      const transaction = db.transaction('state', 'readonly')
      const objectStore = transaction.objectStore('state')
      const getRequest = objectStore.get('state')
      
      getRequest.onsuccess = () => {
        if (getRequest.result) {
          store.replaceState(getRequest.result)
        }
      }
      
      store.subscribe((mutation, state) => {
        const putTransaction = db.transaction('state', 'readwrite')
        putTransaction.objectStore('state').put(state, 'state')
      })
    }
  }
}

四、服務(wù)端持久化方案

對(duì)于需要長(zhǎng)期保存的用戶數(shù)據(jù),應(yīng)該同步到服務(wù)器:

4.1 在 actions 中實(shí)現(xiàn)同步

actions: {
  updateProfile({ commit }, profile) {
    return api.updateProfile(profile)
      .then(updatedProfile => {
        commit('SET_PROFILE', updatedProfile)
        return updatedProfile
      })
  },
  async loadInitialData({ commit }) {
    try {
      const [user, settings] = await Promise.all([
        api.getUser(),
        api.getSettings()
      ])
      commit('SET_USER', user)
      commit('SET_SETTINGS', settings)
    } catch (error) {
      console.error('Failed to load initial data:', error)
    }
  }
}

4.2 頁(yè)面加載時(shí)初始化

在 App.vue 或根組件中:

export default {
  created() {
    // 從服務(wù)器加載初始數(shù)據(jù)
    this.$store.dispatch('loadInitialData')
  }
}

五、綜合解決方案

一個(gè)完整的持久化策略通常包含以下層次:

  • 短期存儲(chǔ):使用 sessionStorage 保存會(huì)話期間的狀態(tài)
  • 長(zhǎng)期存儲(chǔ):使用 localStorage 或 IndexedDB 保存用戶偏好
  • 關(guān)鍵數(shù)據(jù):同步到服務(wù)器確保數(shù)據(jù)安全
import createPersistedState from 'vuex-persistedstate'
import localforage from 'localforage'

// 不同存儲(chǔ)策略
const sessionPersist = createPersistedState({
  storage: window.sessionStorage,
  paths: ['auth.token']  // 會(huì)話 token 使用 sessionStorage
})

const localPersist = createPersistedState({
  paths: ['user.preferences']  // 用戶偏好使用 localStorage
})

const dbPersist = {
  async getItem(key) {
    return (await localforage.getItem(key)) || null
  },
  async setItem(key, value) {
    await localforage.setItem(key, value)
  },
  async removeItem(key) {
    await localforage.removeItem(key)
  }
}

const foragePersist = createPersistedState({
  storage: dbPersist,
  paths: ['projects']  // 大型數(shù)據(jù)使用 IndexedDB
})

const store = new Vuex.Store({
  // ...
  plugins: [sessionPersist, localPersist, foragePersist]
})

六、安全注意事項(xiàng)

  • 敏感信息:不要存儲(chǔ)敏感數(shù)據(jù)(如密碼、token)在客戶端
  • 加密存儲(chǔ):對(duì)重要數(shù)據(jù)進(jìn)行加密
  • 數(shù)據(jù)驗(yàn)證:從存儲(chǔ)加載時(shí)要驗(yàn)證數(shù)據(jù)格式
  • 存儲(chǔ)限制:注意 localStorage 的大小限制(通常 5MB)
import CryptoJS from 'crypto-js'

const SECRET_KEY = 'your-secret-key'

const secureStorage = {
  getItem(key) {
    const encrypted = localStorage.getItem(key)
    if (!encrypted) return null
    const bytes = CryptoJS.AES.decrypt(encrypted, SECRET_KEY)
    return JSON.parse(bytes.toString(CryptoJS.enc.Utf8))
  },
  setItem(key, value) {
    const encrypted = CryptoJS.AES.encrypt(
      JSON.stringify(value), 
      SECRET_KEY
    ).toString()
    localStorage.setItem(key, encrypted)
  }
}

七、Nuxt.js 中的特殊處理

在 Nuxt.js 中使用 Vuex 時(shí),由于服務(wù)端渲染的特性,需要特別注意:

// store/index.js
export const actions = {
  nuxtServerInit({ commit }, { req }) {
    // 從 cookie 初始化狀態(tài)
    if (req.headers.cookie) {
      const cookies = cookie.parse(req.headers.cookie)
      if (cookies.token) {
        commit('auth/SET_TOKEN', cookies.token)
      }
    }
  }
}

配合 js-cookie 在客戶端管理:

import Cookies from 'js-cookie'

const cookiePlugin = store => {
  store.subscribe((mutation, state) => {
    if (mutation.type === 'auth/SET_TOKEN') {
      Cookies.set('token', state.auth.token, { expires: 7 })
    }
  })
}

總結(jié)

根據(jù)項(xiàng)目需求,可以選擇以下方案:

方案適用場(chǎng)景優(yōu)點(diǎn)缺點(diǎn)
localStorage簡(jiǎn)單應(yīng)用、小數(shù)據(jù)量簡(jiǎn)單易用有大小限制、不安全
vuex-persistedstate大多數(shù) Vuex 項(xiàng)目配置靈活、功能完善需要額外依賴
IndexedDB/localForage大數(shù)據(jù)量、復(fù)雜應(yīng)用存儲(chǔ)容量大實(shí)現(xiàn)較復(fù)雜
服務(wù)端同步關(guān)鍵用戶數(shù)據(jù)數(shù)據(jù)安全可靠需要網(wǎng)絡(luò)請(qǐng)求

最佳實(shí)踐建議

  1. 小型應(yīng)用使用 vuex-persistedstate + localStorage
  2. 中大型應(yīng)用組合使用 sessionStorage(會(huì)話數(shù)據(jù))、IndexedDB(應(yīng)用數(shù)據(jù))和服務(wù)端存儲(chǔ)(用戶數(shù)據(jù))
  3. 敏感信息應(yīng)該加密存儲(chǔ)或避免存儲(chǔ)在客戶端
  4. 注意清理過(guò)期的存儲(chǔ)數(shù)據(jù),避免占用過(guò)多空間

通過(guò)合理組合這些技術(shù),可以有效解決 Vuex 狀態(tài)在頁(yè)面刷新后丟失的問(wèn)題,同時(shí)保證應(yīng)用的性能和安全性。

以上就是頁(yè)面刷新后Vuex狀態(tài)丟失的完整解決方案的詳細(xì)內(nèi)容,更多關(guān)于Vuex狀態(tài)丟失的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入學(xué)習(xí)Vue nextTick的用法及原理

    深入學(xué)習(xí)Vue nextTick的用法及原理

    這篇文章主要介紹了深入學(xué)習(xí)Vue nextTick的用法及原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • vue前端和Django后端如何查詢一定時(shí)間段內(nèi)的數(shù)據(jù)

    vue前端和Django后端如何查詢一定時(shí)間段內(nèi)的數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于vue前端和Django后端如何查詢一定時(shí)間段內(nèi)的數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Laravel 如何在blade文件中使用Vue組件的示例代碼

    Laravel 如何在blade文件中使用Vue組件的示例代碼

    這篇文章主要介紹了Laravel 如何在blade文件中使用Vue組件,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • vue cli 3.0 搭建項(xiàng)目的圖文教程

    vue cli 3.0 搭建項(xiàng)目的圖文教程

    這篇文章主要介紹了vue cli 3.0 搭建項(xiàng)目的圖文教程,本文通過(guò)圖片文字相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • Vue網(wǎng)頁(yè)html轉(zhuǎn)換PDF(最低兼容ie10)的思路詳解

    Vue網(wǎng)頁(yè)html轉(zhuǎn)換PDF(最低兼容ie10)的思路詳解

    這篇文章主要介紹了Vue網(wǎng)頁(yè)html轉(zhuǎn)換PDF(最低兼容ie10)的思路詳解,實(shí)現(xiàn)此功能需要引入兩個(gè)插件,需要的朋友可以參考下
    2017-08-08
  • Vue+ECharts實(shí)現(xiàn)中國(guó)地圖的繪制及各省份自動(dòng)輪播高亮顯示

    Vue+ECharts實(shí)現(xiàn)中國(guó)地圖的繪制及各省份自動(dòng)輪播高亮顯示

    這篇文章主要介紹了Vue+ECharts實(shí)現(xiàn)中國(guó)地圖的繪制以及拖動(dòng)、縮放和各省份自動(dòng)輪播高亮顯示,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • vue循環(huán)中調(diào)用接口-promise.all();按順序執(zhí)行異步處理方式

    vue循環(huán)中調(diào)用接口-promise.all();按順序執(zhí)行異步處理方式

    這篇文章主要介紹了vue循環(huán)中調(diào)用接口-promise.all();按順序執(zhí)行異步處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Vue3中v-for的使用示例詳解

    Vue3中v-for的使用示例詳解

    本文主要介紹了Vue3中v-for的使用方法,包括遍歷數(shù)組、遍歷對(duì)象、索引訪問(wèn)、嵌套遍歷以及結(jié)合計(jì)算屬性和方法的使用,v-for可以幫助用戶動(dòng)態(tài)地生成和管理列表數(shù)據(jù),并根據(jù)需要進(jìn)行復(fù)雜的DOM操作,提供了多種示例,幫助讀者更好地理解和使用v-for
    2024-10-10
  • 基于vue2實(shí)現(xiàn)上拉加載功能

    基于vue2實(shí)現(xiàn)上拉加載功能

    這篇文章主要為大家詳細(xì)介紹了基于vue2實(shí)現(xiàn)上拉加載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • vue實(shí)現(xiàn)excel表格的導(dǎo)入導(dǎo)出的示例

    vue實(shí)現(xiàn)excel表格的導(dǎo)入導(dǎo)出的示例

    本文主要介紹了vue實(shí)現(xiàn)excel表格的導(dǎo)入導(dǎo)出的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論