You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用vuex-persistedstate时如何根据记住我选项切换sessionStorage与localStorage

实现动态切换vuex-persistedstate存储类型的方案

你原先的写法不生效的核心原因是:createPersistedState 插件在store实例初始化时就会固定读取storage配置,后续state中flag的变化不会主动触发存储类型切换,需要通过自定义存取逻辑实现动态判断。

步骤1:调整store配置

修改你的store代码如下:

export default store(function (/* { ssrContext } */) {
  // 初始化时优先从存储中读取是否记住我的状态
  const getRememberMe = () => {
    return localStorage.getItem('remember_me') === 'true' || sessionStorage.getItem('remember_me') === 'true'
  }
  const Store = createStore({
    state: {
      rememberMe: getRememberMe()
    },
    mutations: {
      SET_REMEMBER_ME(state, val) {
        state.rememberMe = val
        // 把记住我状态同步到存储,避免刷新丢失
        if (val) {
          localStorage.setItem('remember_me', 'true')
          sessionStorage.removeItem('remember_me')
        } else {
          sessionStorage.setItem('remember_me', 'true')
          localStorage.removeItem('remember_me')
        }
      }
    },
    actions: {
      setLodingMode({ commit }, newMode) {
        commit("SET_LOADING_MODE", newMode);
      },
      resetStates({ commit }) {
        commit("AUTHENTICATION_RESET_STATE");
        commit("login/RESET_STATE");
        // 登出时清除两边存储的记住我标记
        localStorage.removeItem('remember_me')
        sessionStorage.removeItem('remember_me')
      },
    },
    modules: { login, authentication },
    plugins: [
      createPersistedState({
        // 自定义存取逻辑,每次操作前动态判断存储类型
        storage: {
          getItem: (key) => {
            const storage = getRememberMe() ? window.localStorage : window.sessionStorage
            return storage.getItem(key)
          },
          setItem: (key, value) => {
            const storage = getRememberMe() ? window.localStorage : window.sessionStorage
            // 切换存储时清除旧存储的冗余数据,可根据需求选择是否保留
            if (getRememberMe()) sessionStorage.removeItem(key)
            else localStorage.removeItem(key)
            return storage.setItem(key, value)
          },
          removeItem: (key) => {
            const storage = getRememberMe() ? window.localStorage : window.sessionStorage
            return storage.removeItem(key)
          }
        }
      })
    ],
  });
  return Store;
});

步骤2:绑定登录页「记住我」复选框

在登录页组件中,监听复选框的change事件,提交mutation更新记住我状态即可:

// 登录页复选框change事件回调
handleRememberMeChange(checked) {
  this.$store.commit('SET_REMEMBER_ME', checked)
}

可选优化

如果需要在切换记住我状态时迁移已有持久化数据,可以在SET_REMEMBER_ME的mutation中增加逻辑,把旧存储里的vuex持久化数据迁移到新存储中,避免切换后状态丢失。

内容的提问来源于stack exchange,提问作者Muhammad Ehsan Mirzaei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:36:03