掘金文章归档 · 第 47 篇 Vue 系列 5/6 Vue.js · 路由

解决 vue $router.go(-1) 及浏览器返回主页面,主页面无法刷新

外链回退到 Vue 应用页面不刷新:用 pageshow 事件兜底

原文作者:随意_(掘金) | juejin.cn/post/7272742720841908261 | 发布于 2023-08-30 | 阅读 306 · 约 1 分钟

0背景

最近项目中开发,有一个需求大致如下:

  1. 一个门户页面模块,有 tab 切换,每个切换下对应一个列表;
  2. 其中 tabs 有一部分列表是 A 系统的,另一部分需要融合 B 系统的页面;
  3. 均有查看,查看 A 系统的跳转 A 系统对应详情,B 查看需要跳转 B 对应详情;
  4. B 页面的详情有返回功能,使用 $router.go(-1);
  5. B 系统返回,需要 A 主页面门户全部初始化,现在初次加载后会缓存,再次返回不回初始化(不会走 VUE 的任何生命周期)。
截图占位:门户 tab 页面 + A/B 系统详情跳转及返回流程图

1产生原因

vue 应用中跳转到外部连接而后再回退到 vue 应用里面,beforeRouteEnter 没有被触发,created、mounted 里面也没有执行代码,那就证实有可能页面被缓存了,因此这些钩子没有触发。

2解决办法

由于是页面被缓存,即使用 DOM 页面的 pageshow 事件来监听,需要刷新的页面监听 pageshow:

created () {
    window.addEventListener('pageshow', () => {
        // 外链回退到 vue 应用要执行的代码
    })
},
beforeDestroy() {
    window.removeEventListener('pageshow', () => {
     // 外链回退到 vue 应用要执行的代码
    })
}
📌 pageshow 事件在页面每次显示时触发(包括从 bfcache 恢复、外部链接回退等场景),配合 beforeDestroy 中移除监听,可避免内存泄漏。