【vue高频面试题—Vuex篇】:vuex和 localStorage sessionStorage的区别 如何让vuex持久化

131 阅读4分钟

Vuex 和 localStorage / sessionStorage 的区别

特性VuexlocalStoragesessionStorage
存储位置内存中(默认情况下刷新页面丢失)浏览器本地存储,页面刷新后数据依然存在当前会话存储,页面刷新后数据存在,但关闭页面丢失
生命周期页面刷新后重置,除非使用持久化插件永久保存,手动清除前一直存在仅在当前会话有效,页面关闭后自动清除
数据容量较大,可存储任意复杂的数据约 5 MB,适合存储简单数据同 localStorage
数据类型支持任意数据类型(对象、数组、字符串等)只能存储字符串,需要手动序列化和反序列化同 localStorage
作用管理全局状态,适合组件间数据共享适合持久化存储简单数据(如用户配置、token 等)适合临时存储简单数据(如页面状态、临时信息)
响应式响应式(状态变化自动更新视图)非响应式,数据改变不会自动更新 UI非响应式,数据改变不会自动更新 UI

如何让 Vuex 持久化?

由于 Vuex 的状态默认保存在内存中,页面刷新后会丢失,可以通过以下几种方式实现 Vuex 状态持久化

1. 手动结合 localStorage / sessionStorage 持久化

原理

  • 在 Vuex 初始化时,从 localStorage / sessionStorage 读取数据恢复状态。
  • 在 Vuex 状态变化时,将数据同步到本地存储。

示例代码:

// store/index.js
import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

// 从 localStorage 获取初始状态
const savedState = JSON.parse(localStorage.getItem("vuexState")) || {};

const store = new Vuex.Store({
  state: {
    user: savedState.user || { name: "", token: "" }, // 恢复 user 状态
    cart: savedState.cart || []                     // 恢复 cart 状态
  },
  mutations: {
    setUser(state, user) {
      state.user = user;
    },
    addToCart(state, item) {
      state.cart.push(item);
    }
  }
});

// 监听状态变化,并保存到 localStorage
store.subscribe((mutation, state) => {
  localStorage.setItem("vuexState", JSON.stringify(state));
});

export default store;

步骤说明:

  1. state 初始化时,从 localStorage 读取状态数据。
  2. 通过 store.subscribe() 监听状态变化,并将最新的状态存储到 localStorage
  3. 页面刷新时,Vuex 状态会自动从 localStorage 恢复。

2. 使用第三方库 vuex-persistedstate

vuex-persistedstate 是一个专门用于 Vuex 状态持久化的插件,可以轻松实现 Vuex 状态与本地存储(localStoragesessionStorage)的自动同步。

安装:

npm install vuex-persistedstate

使用方法:

import Vue from "vue";
import Vuex from "vuex";
import createPersistedState from "vuex-persistedstate"; // 引入插件

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    user: { name: "", token: "" },
    cart: []
  },
  mutations: {
    setUser(state, user) {
      state.user = user;
    },
    addToCart(state, item) {
      state.cart.push(item);
    }
  },
  plugins: [createPersistedState()] // 持久化插件
});

export default store;

插件特点:

  • 状态会自动保存到 localStorage(默认)。
  • 页面刷新时,状态会自动恢复。

自定义存储位置(sessionStorage):

plugins: [createPersistedState({
  storage: window.sessionStorage // 使用 sessionStorage
})]

3. 结合 Cookie 实现持久化

在一些需要更高安全性的场景下(例如存储 token),可以使用 Cookie 来持久化 Vuex 状态。

示例代码:

import Vue from "vue";
import Vuex from "vuex";
import Cookies from "js-cookie";

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    token: Cookies.get("token") || ""
  },
  mutations: {
    setToken(state, token) {
      state.token = token;
      Cookies.set("token", token, { expires: 7 }); // 7 天过期
    }
  }
});

export default store;

特点:

  • Cookies 可设置过期时间,提高安全性。
  • 适合存储小数据,如认证 token

4. 使用 Vuex + IndexedDB(适合大数据量场景)

对于需要存储大量数据的场景,localStoragesessionStorage 容量有限(约 5MB)。此时可以使用 IndexedDB 结合 Vuex 进行持久化。

  • IndexedDB 是浏览器提供的数据库,可以存储大量数据。
  • 可以使用第三方库如 localforage,结合 vuex-persistedstate 使用。

总结: Vuex 持久化方案

方案适用场景特点
localStorage持久化存储数据,页面刷新或关闭后仍可恢复状态简单易用,数据永久保存,容量有限
sessionStorage临时存储数据,页面关闭后自动清除数据仅在会话期间有效
vuex-persistedstate中小型项目,快速实现 Vuex 持久化插件简洁易用,支持 localStoragesessionStorage
Cookie安全性高,适合存储认证信息(如 token)支持过期时间,安全性较高,但容量较小
IndexedDB需要存储大量数据的场景数据库存储,容量大,适合复杂场景

结合项目场景

  • 对于中小型项目,推荐使用 vuex-persistedstate 插件,将数据保存到 localStoragesessionStorage
  • 对于安全性敏感的数据(如 token),推荐使用 Cookie 并设置过期时间。
  • 对于大数据量场景,推荐使用 IndexedDB