解决redux/Vuex刷新页面数据丢失问题

本文探讨了在A页面跳转至B页面时如何避免重复请求数据,以及解决redux和Vuex在刷新页面时数据丢失的问题。提出了通过持久化存储如sessionStorage来保存状态,并在应用启动时恢复,以及使用redux-persist插件进行数据持久化的解决方案。同时,文章提到了前端路由的工作原理以及页面间数据交互的考量因素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

先简单描述一下需求:

  • A页面和B页面都需要通过同一个接口获取的数据来展示页面;
  • B是A的子页面,从A页面可以跳转到B页面;

思考

从减少页面的http请求数来达到性能优化的方面来考虑:可不可以A跳到B页面后,不再ajax请求数据,而是直接获取A页面Model里的数据?(如图)

在这里插入图片描述

尝试

按上述思路可以达到需求。但同时也发现一个问题:在重新刷新B页面时,B页面上显示的数据为空。

分析

Redux一个用于应用程序状态管理的开源JavaScript库,本质是管理组件数据状态的。刷新浏览器,相当于重新开启应用,必定会从最初的状态重新开始。如果想获取值,要么向后台发送请求,要么将值本地存储,从本地存储去取值。单说刷新浏览器,肯定是回复到最初状态,相当于什么也没做。

这里也涉及到前端路由和后端路由的问题。前端路由分为hash模式和history模式,我们从A页面跳转到B页面,本质上并没有从后端重新请求数据,而是前端通过正则匹配路由规则从而显示相应的页面(例:网易云音乐网页版)。

页面间数据交互的方式有很多种,在实际项目中我们要从多方面考虑去选择最优的方法。例如要考虑A页面是否是B页面的唯一来源、是否还能通过其它页面跳转至B页面…
实践是理论基础到真实能力的一种转化。在实际的业务场景中要前言使用基础,去验证基础,去通过基础来设计更合理的方案。

扩展(解决方案)

Vuex

思路:在页面刷新前将Vuex里的数据保存到 sessionStorage 中,进入应用时再从 sessionStorage 中取出数据并替换 store 的state,还原之前的状态;在Redux中也同理。

/**
 * 缓存Vuex里的数据,解决页面刷新Vuex数据丢失问题
 * @param {*} type 缓存方式 sessionStorage 和 localStorage ,默认是sessionStorage
 */
export function cacheVuex(store, type = sessionStorage) {
  if (type.getItem('_store')) {
    store.replaceState(
      Object.assign({}, store.state, JSON.parse(type.getItem('_store')))
    );
  }
  window.addEventListener('beforeunload', () => {
    type.setItem('_store', JSON.stringify(store.state));
  });
}
1.redux状态的持久化,保证页面刷新或者关闭后能恢复状态
代码如下
let initialState={};
if(localStorage.getItem('store')){
  initialState=JSON.parse(localStorage.getItem('store'));
}

// 1. Initialize
const app = dva({
  history: browserHistory,
  initialState:initialState
});

window.onunload=function () {
  localStorage.setItem('store',JSON.stringify(app._store.getState()));
};
原理

使用sessionStorage或者localStorage来达到数据存储;

缺点

因为dva中inititalState优先级比model中state高,整个状态持久化后,model State的结构改变,例如添加新key,会因为缓存导致无法应用,此方案有缺点。

2.解决redux刷新页面数据丢失问题(使用redux-persist持久化数据存储)

参考链接:https://segmentfault.com/a/1190000018150177

### Vue3 中 Pinia 的数据持久化解决方案 在 Vue3 项目中,Pinia 是一种强大的状态管理工具,但它默认并不具备数据持久化功能。当页面刷新时,存储在内存中的状态会被清空,从而导致数据丢失。为了解决这一问题,可以采用 `pinia-plugin-persistedstate` 插件来实现状态的持久化。 #### 安装插件 首先需要安装 `pinia-plugin-persistedstate` 插件: ```bash npm install pinia-plugin-persistedstate ``` #### 配置插件 接着,在项目的入口文件中引入并配置该插件: ```javascript import { createPinia } from 'pinia'; import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'; const pinia = createPinia(); pinia.use(piniaPluginPersistedstate); export default pinia; ``` 上述代码实现了将 `pinia-plugin-persistedstate` 注册到 Pinia 实例上[^5]。 #### 使用持久化选项 定义 Store 时可以通过传递 `persist` 属性来自定义持久化行为。例如: ```javascript import { defineStore } from 'pinia'; export const useUserStore = defineStore('user', { state: () => ({ token: '', username: '' }), actions: { setToken(newToken) { this.token = newToken; }, setUsername(name) { this.username = name; } }, persist: true // 开启持久化,默认使用 localStorage }); ``` 在此示例中,`persist: true` 表明此 Store 的状态将会被自动同步至浏览器的 `localStorage` 中[^1]。 如果需要更精细地控制持久化逻辑,还可以传入对象形式的配置参数: ```javascript persist: { key: 'user-store', // 自定义存储键名 storage: sessionStorage, // 可选:指定使用 sessionStorage 而不是默认的 localStorage } ``` #### 初始化 State 值 通过 `pinia-plugin-persistedstate` 插件,State 初始值会在应用启动时从本地存储恢复。这意味着即使页面刷新,之前保存的状态也会重新加载[^4]。 --- ### 总结 以上方法利用了 `pinia-plugin-persistedstate` 插件解决了 Pinia 在页面刷新后的数据丢失问题。它支持多种存储方式(如 `localStorage` 和 `sessionStorage`),能够满足大多数场景下的需求[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值