vue跳转,前进后退,点击浏览器的返回按钮,地址栏路由变了但是页面没跳转

Vue项目使用
this.$router.push({
path: ‘/home’
});进行跳转
从页面A—>B,B—>C,C—>B(OK),B—>A(失败)已解决

一、跳转设置:

1、在APP.vue中:页面切换的位置,对不同的页面进行不同的渲染。
不需要让页面重新加载时用keep-alive来对页面进行缓存,防止重复渲染DOM
不使用keep-alive:
beforeRouteEnter > beforeCreate > created> mounted > activated > … … > beforeRouteLeave > deactivated
使用keep-alive:
beforeRouteEnter >activated > … … > beforeRouteLeave > deactivated

<template>
  <div id="app">
    <keep-alive><router-view v-if="$route.meta.keepAlive"/></keep-alive>
    <router-view v-if="!$route.meta.keepAlive" />
  </div>
</template>

2、在路由中设置keepAlive属性判断是否需要缓存,在需要缓存的路由中加入keepAlive:true.
router.js

const routes = [
  {
    path: "/home",
    name: "Home",
    component: () => import("@/views/Home"),
    meta: {
      keepAlive: true,
    }
    },
    {
    path: "/menufour",
    name: "menuFour",
    component: () => import("@/views/Home/menuFour"),
    meta: {
      keepAlive: true,
    }
  },
  {
    path: "/iframe",
    name: "Iframe",
    component: () => import("@/views/Home/iframe"),
  }]
  const router = new VueRouter({
  routes
});
router.beforeEach((to, from, next) => {
  next();
  });
  export default router;

3、在Home/index.vue页面中加入跳转。

 this.$router.push({
            path: "/menufour",
          });
 this.$router.push({
                path: "/iframe",
          });

二、解决办法

1、排查错误原因
在router.js中beforeEach打印from 和 to,发现路由正常跳转,没有问题,且没忽略next()。
2、考虑A页面是否有报错导致返回时加载不出来,意外发现在从A—>B页面时设置的一些条件状态满足从A—>B的,也就导致在从B—>A时,发生了B—>A—>B,不知道为什么B—>A—>B只打印了B—>A的路由,当把A页面中的状态调整之后,B—>A就能正常返回了。

### 浏览器回退时不刷新页面的技术方案 为了实现浏览器回退时不刷新页面的功能,可以通过多种技术手段来达成目标。以下是几种常见的方法及其原理: #### 方法一:利用 HTML5 History API HTML5 提供了 `History` 对象,允许开发者通过编程方式管理浏览器历史记录栈。当用户点击浏览器的回退按钮时,不会触发页面的整体刷新,而只是执行 JavaScript 中定义的行为。 - 使用 `history.pushState()` 或 `history.replaceState()` 来修改 URL 和状态,而不实际重新加载页面。 - 结合 `popstate` 事件监听用户的导航行为,在回调函数中手动控制页面内容的变化。 ```javascript // 添加一个新的历史条目 window.history.pushState({ page: 1 }, "title", "/page1"); // 监听 popstate 事件 window.addEventListener('popstate', function(event) { console.log("Popstate triggered:", event.state); }); ``` 这种方法的核心在于避免传统的锚点跳转或重定向机制,从而减少不必要的页面刷新[^4]。 --- #### 方法二:Vue 路由中的动态组件复用 在基于单页应用(SPA)框架如 Vue.js 的开发场景下,可以借助路由配置和生命周期钩子优化回退体验。 - 配置路由时设置 `keep-alive` 属性以缓存特定组件实例,使得再次进入该页面时无需重新渲染。 - 利用 `beforeRouteLeave` 和 `beforeRouteEnter` 等守卫函数保存当前页面的状态,并在返回时恢复这些状态。 ```vue <template> <div> <keep-alive> <router-view></router-view> </keep-alive> </div> </template> <script> export default { beforeRouteLeave(to, from, next) { // 存储离开前的数据状态 this.saveState(); next(); }, beforeRouteEnter(to, from, next) { next(vm => { vm.restoreState(); // 恢复数据状态 }); } }; </script> ``` 这种方式特别适合 SPA 场景下的页面切换逻辑优化[^3]。 --- #### 方法三:禁用默认回退行为并自定义处理 如果完全不需要依赖浏览器自带的回退功能,则可以直接拦截其默认动作并通过其他交互形式替代之。 - 可以尝试绑定全局键盘事件或者覆盖 window.onpopstate 行为。 - 注意这种做法可能会影响用户体验,需谨慎评估适用场合。 ```javascript function preventBack() { window.history.forward(); } setTimeout(preventBack, 0); window.onunload = function () {}; ``` 尽管如此,强制干预用户习惯的操作往往并不推荐,除非有非常特殊的需求背景支持这样做[^1]。 --- #### 方法四:针对 iOS 设备特性的适配调整 由于部分移动操作系统存在特殊的缓存策略(比如某些版本iOS Safari),即使发生了物理意义上的“页面切换”,实际上也只是显示本地存储的内容副本而已。因此对于这类平台上的异常表现还需要单独考虑应对措施。 - 动态注入脚本片段改 DOM 树结构; - 设置 meta 标签声明 no-cache 缓存规则; ```html <meta http-equiv="Cache-Control" content="no-store"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> ``` 另外也可以采用定时轮询服务器端最新资料的方式间接达到目的[^2]。 --- ### 总结 综上所述,具体采取哪种办法取决于项目实际情况以及兼容性需求等因素综合考量之后决定最佳实践路径。无论是单纯依靠原生API还是结合现代前端框架特性共同作用都可以有效解决问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值