解决vue单页面应用刷新网页后state数据丢失问题

vue单页面F5刷新,state数据丢失问题

iview实现单页面的数据管理

很多数据管理,各种借口调用,F5刷新后全变成空白表格

解决方法

在主页面加载时去读取sessionStorage,页面重载时存储整个store到sessionStorage,可以实现数据本地化存储,解决刷新丢失数据的问题

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

<script>
export default {
  name: 'App',
  created () {
    //在页面加载时读取sessionStorage里的状态信息
    if (sessionStorage.getItem("store") ) {
        this.$store.replaceState(Object.assign({}, this.$store.state,JSON.parse(sessionStorage.getItem("store"))))
    }
    //在页面刷新时将vuex里的信息保存到sessionStorage里
    window.addEventListener("beforeunload",()=>{
        sessionStorage.setItem("store",JSON.stringify(this.$store.state))
    })
  }
}
</script>

参考

### Vue 页面刷新 `beforeRouteEnter` 钩子失效解决方案 当页面刷新时,组件会重新加载并执行生命周期钩子中的逻辑。然而,在这种情况下,`beforeRouteEnter` 钩子可能不会按预期工作,因为它是导航进入匹配的路由之前调用的[^1]。 为了确保在页面刷新后仍然能够捕获到必要的状态或参数,建议采用以下几种方法: #### 方法一:使用 Vuex 存储共享状态 通过 Vuex 来集中管理和持久化应用的状态是一个有效的策略。可以在每次成功访问特定路径时将所需的数据保存至 store 中,并在组件挂载(`mounted`)阶段从 store 获取这些数据来初始化视图。 ```javascript // store.js import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state: { sharedData: null, }, mutations: { SET_SHARED_DATA(state, data) { state.sharedData = data; } }, }); ``` ```javascript // component.vue <script> export default { mounted() { const storedData = this.$store.state.sharedData; if (storedData !== null && typeof storedData === "object") { Object.assign(this, storedData); } }, }; </script> ``` #### 方法二:利用本地存储机制(LocalStorage/SessionStorage) 另一种方式是在浏览器端使用 LocalStorage 或 SessionStorage 将重要信息缓存起来。这样即使用户刷新了页面也可以恢复之前的上下文环境[^3]。 ```javascript // 在离开当前页面前保存数据到 sessionStorage window.addEventListener('beforeunload', () => { let dataToStore = JSON.stringify({ key: value }); sessionStorage.setItem('cachedPageState', dataToStore ); }); // 组件创建时尝试读取已有的 session 数据 created(){ try{ var cachedData = JSON.parse(sessionStorage.getItem('cachedPageState')); if(cachedData){ // 使用缓存的数据更新组件属性... } }catch(e){} } ``` #### 方法三:调整路由配置以支持查询字符串传递参数 如果问题是由于 URL 参数丢失引起的,则可以通过设置动态段或者查询参数的方式让其保持不变。对于带有参数的链接应尽可能地设计成可书签的形式,即无论何时打开该地址都能正确显示对应的内容[^2]。 ```javascript const routes = [ { path: '/list/:id', name: 'ListDetail', props: true, ... } ]; ``` 以上三种方案可以根据实际需求单独或组合运用,从而有效应对因页面刷新而导致的 `beforeRouteEnter` 失效问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值