• 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这个回掉,不然神仙都解决不了这个问题。。。。

  • 相关阅读:
    面试百问:项目上线后才发现bug怎么办?
    云原生|kubernetes 你真的学废了吗---实战k8s 一(jsonpath实战)
    功能测试自动化测试流程
    Layui + Flask | 实现数据表格修改(案例篇)(09)
    Spring Security OAuth2 实战
    Redis——》数据类型:Hash(哈希)
    作图从此不求人,代谢组学宝藏作图能力提升班你来不来?
    微信公众号与小程序打通:流量变现的新路径
    【数据分享】上海市出租车GPS数据
    图神经网络 | Python基于图卷积的U-Net架构进行交通流量和速度的预测
  • 原文地址:https://blog.csdn.net/bianliuzhu/article/details/126874967