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


    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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    问题到这里就修复了

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

  • 相关阅读:
    TLS及反调试机制
    CSDN每日一练 |『括号上色』『严查枪火』『数组排序』2023-09-09
    把第三方jar引入到maven中
    Eureka原理与实践:构建高效的微服务架构
    计算机网络基础(二):物理层、数据链路层及网络层
    【ML】基于机器学习的糖尿病预测(回归问题)
    【buildroot】buildroot使用笔记-01 | 常规使用步骤
    (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
    anime 动画引擎
    简历编写指南及注意事项
  • 原文地址:https://blog.csdn.net/bianliuzhu/article/details/126874967