美文网首页
点击浏览器的后退按钮,回退到上一个路由

点击浏览器的后退按钮,回退到上一个路由

作者: IssunRadiance | 来源:发表于2025-05-13 17:45 被阅读0次

项目中遇到一个问题:
当我在/goodList页面上, 地址栏的参数发生过改变,我的路有变化如下:

  1. /index
  2. /goodslist?c_id=6661&c_t=3
  3. /goodslist?c_id=6666&c_t=3
  4. /goodslist?c_id=5773&c_t=2

这时候如果用户点击浏览器的后退按钮,只是回退参数,而不是回到上一个路由。 回到了:3. /goodslist?c_id=6666&c_t=3

用户体验不佳:点击后退按钮,页面看似没有变化。

我的目的是想回到 1. /index

解决方案:拦截后退操作,当检测到 参数变化 而不是路由变化时,手动导航到上一个路由。
- 使用 popstate 监听历史变化:

因为我的Vue Router版本低,没有this.$router.history.stack, 所以我们手动创建历史栈

在main.js中全局注册,后退操作在 main.js 中集中处理,便于维护

// 自定义历史栈
const historyStack = [];

// 判断两个路由路径是否相同(不包含参数)
function isSamePath(route1, route2) {
  return route1.path === route2.path;
}

// 监听路由变化,修改历史栈
router.beforeEach((to, from, next) => {
  const routeData = {
    path: to.path,
    query: to.query,
    params: to.params,
    hash: to.hash,
  };

  // 如果栈为空,或者当前路由和栈顶路由路径不同,添加到栈
  if (historyStack.length === 0 || !isSamePath(historyStack[historyStack.length - 1], routeData)) {
    historyStack.push(routeData);  // 新的路由直接添加
  } else {
    // 如果路径相同,则删除栈中的最后一个路由,再添加新的路由
    historyStack.pop();
    historyStack.push(routeData);
  }

  next();
});

// 后退逻辑
function handlePop() {
  if (historyStack.length > 1) {
    historyStack.pop();  // 弹出当前路径
  }
  const prevRoute = historyStack[historyStack.length - 1] || { path: '/' };

  // 使用完整路由信息进行跳转
  router.replace(prevRoute);
  console.log('当前历史栈:', historyStack);
}

// 浏览器后退按钮监听
window.addEventListener('popstate', () => {
  handlePop();
});

这样就可以实现,点击浏览器的后退按钮时, 回退到和当前路由不同的上一个路由, 而不是上一个参数不同的网址上!

相关文章

  • Vue页面回退参数丢失

    场景:A页面进入到B页面时,通过路由传参数,由B页面获取。B页面进入到C页面,回退到B页面(点击浏览器后退按钮,或...

  • vue3 路由跳转相关

    需求: 点击按钮实现页面跳转&&触发浏览器的回到上一页/下一页,页面和按钮效果实时变化。 方法: 监听路由变化,v...

  • iframe 后退 浏览器history 问题

    问题 浏览器机制的原因,在iframe导航变化后手动点击浏览器的后退按钮也依然只是后退iframe中的导航 只想让...

  • Android学习笔记08—ActionBar回退按钮标准模式开

    实现描述 在使用android应用时,经常会点击回退按钮,点击后当前窗体会切换到上一个窗体。而有时浏览列表信息时,...

  • dva 配置 browserHistory 实践总结

    一、什么是 History 1. 概述 history 是历史记录管理。点击 a 标签跳转或者点击浏览器后退按钮,...

  • AJAX的刷新跳转

    目前,在主页面中使用AJAX进行页面刷新,然后点击某个链接跳转之后,点击浏览器的回退按钮,想返回到主页面AJAX操...

  • vue 路由的push与replace的区别

    push 跳转到对应的路由,这个方法会向history栈添加一个记录,点击后退会返回到上一个页面。replace同...

  • 8.使用栈实现浏览器的前进后退

    使用栈实现浏览器的前进后退 当你一次访问 1、2、3 页面之后,点击浏览器的后退按钮就可以返回到 2 和 1.当后...

  • Bom 浏览器对象模型 操作浏览器

    window .history.back 浏览器后退按钮.history.forward 浏览器前按钮 go(...

  • HTML5的history对象

    浏览器有一个history对象,用来保存浏览历史,用户可以通过点击浏览器的后退或前进按钮在历史记录中切换。之前对h...

网友评论

      本文标题:点击浏览器的后退按钮,回退到上一个路由

      本文链接:https://www.haomeiwen.com/subject/fjmvijtx.html