vue中使用history.replaceState 更改url vue router 无法感知的问题

news/2024/7/10 2:02:46 标签: vue

vuehistoryreplaceState_url_vue_router__0">vue中使用history.replaceState 更改url vue router 无法感知的问题

描述

最近做一个需求,URL更新不刷新页面,在网上找了 好多文章都说 router.replace 更新URL不会刷新页面(前提是路由为 history 模式),我也用了,一开始是没问题的,可以实现需求,但是后来URL变得越来越复杂,会导致URL更新时,会触发mounted执行,这样的话页面就会刷新,后来更换了 history.replaceState API 更新URL,页面确实不刷新了,但是也带来了新的问题,就是 vue router 无法感知到URL的变化 ,举个例子吧

假设

url:www.eg.com/index?a=1
使用router.replace 更新 url this.$router.replace('www.eg.com/index?a=2')
输出 fullpath console.log(this.$route.fullPath) => www.eg.com/index?a=2
这个结果是对的;

如果使用 history.replaceState 更新url就会出现问题
使用 history.replaceState 更新 url history.replaceState(null,'','www.eg.com/index?a=2');url 确实是更新了,
输出 fullpath console.log(this.$route.fullPath) => www.eg.com/index?a=1

结论: this.$route 就没有被更新

如何修复这个问题

// 这个 stateObj 其实就是查询参数的 key value 转换成的对象
const stateObj = {
	a:2,
	b:3
}
history.replaceState(stateObj, 'title', 'www.eg.com/index?a=2&b=3')
// 将原来的 this.$route 克隆一份
const _route = Object.assign({},this.$route);
// 更新 fullPath 
_route.fullPath = 'www.eg.com/index?a=2&b=3'
// 更新 参数
_route.params = stateObj
// 调用 router.history 里的更新方法 cb 传入最新的route就可以了
this.$router.history.cb(_route)
// 我们再次输出 fullPath
console.log(this.$route.fullPath) => 'www.eg.com/index?a=2&b=3'

问题到这里就修复了

其实 使用 history api 更新 URL 这个功能 react router 早在 V3 版本就已经实现了,话说这已经是 5 ,6 年前的问题了, 也就是说 使用 history api 更新url react router 是可以感知到 URL 变化的并且会被记录,但是vue没有,还好有router.history.cb这个回掉,不然神仙都解决不了这个问题。。。。


http://www.niftyadmin.cn/n/1080848.html

相关文章

一个一起成长的机会

你有多久没学习了?当你看到这句话时,请闭上眼,好好想一想,你有多久,没认真学习过了,又有多久,没有过搞定一个难点的兴奋与自豪了?互联网行业技术变化之快想必圈内人士都有所了解&…

error TS7016: Could not find a declaration file for module ‘*‘.

使用CRA初始化了一个 React 18 的 TS 项目,配置好 mock-service-plugin mock 服务后想起项目体验下就收到下面错误 错误信息如下 error TS7016: Could not find a declaration file for module mock-service-plugin. app-ts/node_modules/mock-service-plugin/sr…

Hdu-1800 Flying to the Mars

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid1800 题目大意: 给你一堆士兵的等级,等级高的的士兵可以当等级小的士兵的师傅,一个士兵最多一个师傅(可以没有),一个师傅最多1个徒弟&am…

人间四月天,有一本好书要送给你

人间四月天,清新而又婉约,是爱,是暖,是希望。今天是四月的最后一天,你在四月付出了多少努力,又收获了多少果实,留下了多少遗憾,又种下了多少希望呢?小罗在4月初立下flag&…

js解析Dicom文件

小伙伴 : 当你看到这篇博客的时候,你的问题将全部迎刃而解. 1.如何在自己的vue项目中展示Dicom文件, 2.js如何解析Dicom文件 3.前端如何显示Dicom 这些问题也困扰我很长时间,不过都是小事,没有你著哥解决不了的技术问题so easy! 推荐另外一篇文章: cornerstone.js解析Dicom图…

教你如何永久订阅最新IQuickTest博文

如果你希望每次都能够在第一时间查看到IQuickTest最新发布的测试文章,那么我们推荐你使用Rss订阅IQuickTest IQuickTest提供两种永久订阅方式: --> GoogleReader订阅方式 --> 电子邮箱订阅方式 (注意:如有更新每天早上九点…

华为面试改革,增加当面编程环节,由“软件单板王”担任面试官

4月29日,华为轮值董事长徐直军向华为全员发布总裁办邮件,宣布进行软件人才的面试改革,加入一轮90分钟的网上编程环节和两轮30分钟的当面编程环节,首批面试官由软件单板王、committer、优秀的软件架构师担任。 (1&#…

pdf.js使用方法

应各位博友要求已经取消付费 2022.3.20 项目中 显示 pdf 的功能,浏览过不少的技术帖,都不太理想,花了点时间研究了下pdf.js正确使用方法,总结下:1.防止自己忘记 2.工作留有痕迹 3.供大家参考借鉴 pdf.js: 将 PDF 文件解析后生成一张 .png 图片,利用 canvas 元素显示在页面上,…