vuex之刷新页面时token丢失问题

本文详细阐述了如何通过sessionStorage在前端项目中避免Vuex状态在页面刷新时丢失,包括使用localStorage缓存、代码实现和初始化state的方法,确保登录状态在页面刷新后的延续性。
前端项目,使用vuex作为状态存储,但是遇到一个问题,就是在刷新页面时出现了丢失token的问题,下面给出完美的解答:

1.可以使用缓存将vuex中的state缓存起来,可以使用localStorage和sessionStorage。cookie不适合存储。
localStorage是长期存储,sessionStorage是会话期间存储,这里使用sessionStorage.
在这里插入图片描述
在这里插入图片描述

2.上代码
App.vue中添加 mounted()和methods,在刷新的时候进行持久化。

<template>
  <div id="app">
    <router-view />
  </div>
</template>

<script>
export default {
  name: 'App',

  /**
   * 当页面刷新时vuex存储的数据会消失,因此一般使用sessionStorage处理
   */
  mounted() {
    window.addEventListener('unload', this.saveState);
  },
  methods: {
    saveState() {
      sessionStorage.setItem('state', JSON.stringify(this.$store.state));
    }
  },
}
</script>

在state初始化的时候,去sessionStorage中寻找token等相关参数。
上代码:

import { login, logout, getInfo } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { resetRouter } from '@/router'

const getDefaultState = () => {
  return {
    token: getToken(),
    name: '',
    avatar: ''
  }
}

// 改写state, 防止出现刷新页面之后丢失state,需要对state进行格式化:JSON.parse()
const state = sessionStorage.getItem('state') ? JSON.parse(sessionStorage.getItem('state')).user : getDefaultState();

console.log("state: ", state);

const mutations = {
    RESET_STATE: (state) => {
        Object.assign(state, getDefaultState())
    },
    SET_TOKEN: (state, token) => {
        state.token = token
    },
    SET_NAME: (state, name) => {
        state.name = name
    },
    SET_AVATAR: (state, avatar) => {
        state.avatar = avatar
    }
}

### 使用Vuex实现数据持久化 为了防止页面刷新导致的数据丢失,可以采用多种方法来实现在 Vue.jsVuex 的数据持久化。以下是两种主要的方法: #### 方法一:使用 `vuex-persistedstate` 插件 安装并配置 `vuex-persistedstate` 是一种简便的方式来进行状态的持久化处理。 首先,通过 npm 安装该插件[^3]: ```bash npm install vuex-persistedstate ``` 接着,在创建 Vuex store 实例引入此插件,并将其作为插件传递给 Vuex Store 构造函数: ```javascript import createPersistedState from 'vuex-persistedstate' const store = new Vuex.Store({ plugins: [createPersistedState()], state: { // 初始状态定义 }, mutations: { // 变更逻辑保持不变 } }) ``` 这种方法会自动将整个 Vuex 状态树同步至浏览器的 localStorage 或 sessionStorage 中,从而使得即使是在页面刷新之后也能够恢复之前的状态[^1]。 #### 方法二:手动集成本地存储机制 另一种方式是不依赖第三方库而直接利用 JavaScript 提供的 Web Storage API (localStorage/sessionStorage),在每次修改 Vuex State 都主动调用相应接口保存最新版本的状态;而在应用启动之初,则尝试从这些地方加载已有的记录填充回 Vuex State。 下面展示了一个简单的例子说明如何操作 session storage 来达到目的[^2]: ```javascript export default new Vuex.Store({ state: { token: window.sessionStorage.getItem('token') || '' // 初始化尝试获取已有 token 值 }, mutations: { saveToken(state, data) { state.token = data; window.sessionStorage.setItem('token', data); // 更新的同写入 session storage } } }); ``` 这两种策略都能有效地应对由于用户导航离开当前网页或是关闭标签页所引发的状态遗失问题。开发者可以根据项目需求和个人偏好选择合适的技术路线实施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值