当前位置: 首页 > ds >正文

vue3 控制url更新但不让页面更新

前言

最近遇到一个特定的前端需求

  1. 要求url每次打开都是正确的详情页面,也就是说每次更换详情页,url必须得更新
  2. keep-alive 无法使用 keep-alive会让整个页面都缓存,从其它路由跳回来的时候,仍然是之前的状态,不符合业务的要求
  3. 需要在切换文件的时候,更新url,并且只更新文件展示的那一块儿,其它不更新。

因为有了上面的三点,所以,有了以下方案。

通过history.replaceState控制url变更

history.replaceState是h5自带的api,能够单纯的改变url,vue-router也是通过这个去改变url的。
onBeforeRouteUpdate 是vue-router 提供的一个hook,能在router.replace
或者router.push 调用后执行。

import { useRouter, useRoute, onBeforeRouteUpdate } from "vue-router";// 阻止路由变更导致的页面刷新 但是当你点回去的时候不会触发
onBeforeRouteUpdate((to, from) => {// 当to和from的path相同时,拦截,不要执行页面的刷新,虽然path相同,但后面的参数不同也符合这个条件,即同一个路由下的页面拦截不刷新页面。if(to.path === from.path) {// console.log('路由更新了,但是没有变化')// 将url变更 但是页面不刷新history.replaceState({}, '', to.fullPath)// 页面不刷新就要手动执行代码,让需要的内容更新....// 一定要返回false 才能阻止vue-router对页面的刷新return false}
})

上面的方案会有一个问题。虽然我们控制了url的改变,但由于返回了false,阻止了页面刷新,也阻止了vue-router本身的更新。

所以 vue-router这个实例对象一直都没变过。这样当你将url切换到其它路径时,没问题,但是想要切换回来,onBeforeRouteUpdate 根本检测不到,因为你的router实例压根就没变化,所以一旦离开最开始进入的页面,想要回来就不行了。

解决无法回到最开始的页面

import { useRouter, useRoute } from "vue-router";
const router = useRouter()
router.replace({path: "/xxx/detail",query: {// 传递对应的参数... updateRouter: Math.random().toString()},
});

通过上面的方法,控制路由跳转,加了一个updateRouter 的随机参数,保证每一次/xxx/detail 这个页面下route实例都发生了变化,每一次onBeforeRouteUpdate都能检测到变化并执行。

其它问题

由于router.replace 或者router.push 在 /xxx/detail 中的所有跳转都被拦截了,并没有改变route实例。

所以在 /xxx/detail 页面 中其它地方,想要获取router.query里面的参数都是拿不到最新的,只能拿到最开始进入页面的那些参数。

所以我们还需要将原本路由中的的参数以新的方式传递和获取,比如放到pinia中或者localstorage中等。

http://www.xdnf.cn/news/9785.html

相关文章:

  • 回溯算法找出来最优价格组合
  • 深度学习-梯度消失和梯度爆炸
  • 光的干涉、衍射与偏振
  • Python入门手册:模块和包的导入与使用
  • Cookie与Session深度解析:Web会话管理的核心技术
  • 健康管理软件未来趋势:三大核心功能深度解析
  • Windows下的Qtxlsx下载和编译打包成库
  • 消息队列从入门到实战:用外卖订单理解高并发系统的核心设计
  • YOLOv8 区域计数系统:基于计算机视觉的智能物体计数方案
  • vue3+element plus 自定义组件,单列的方块 图形加文字列表
  • 写作即是生活
  • 华南版权服务大厅启用:富唯智能携具身智能人形机器人亮相,赋能版权产业生态革新
  • 【深度学习-pytorch篇】2. Activation, 多层感知机与LLaMA中的MLP实现解析
  • 数据结构与算法:数位dp
  • 在多线程编程里,若要强制两个线程按特定次序访问相同内存区域,可借助多种同步机制达成
  • Linux软链接的目的
  • 召回增强RAPTOR策略
  • 响应式布局进阶:企业商城系统复杂交互页面的多端适配方案
  • Python训练打卡Day36
  • flutter加载dll 报错问题
  • Cesium实现标注动画
  • SMME 2025:创新海洋工程模式,迎接未来挑战
  • 深入解析 CountDownLatch、Semaphore 和CyclicBarrier
  • NHANES指标推荐:CircS
  • 3D LUT--颜色魔方
  • 生物化学:药品药物 营养和补充剂信息 第三方认证信息 常见误区 汇总
  • VirtualBox怎样安装Win10
  • 直角坐标系下 dxdy 微小矩形面积
  • 硬盘驱动器习题解析
  • 力扣刷题 -- 20.有效的括号