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

  • 相关阅读:
    NVIDIA DALI学习:数据加载
    字符串思维题练习 DAY6 (CF 245H , CF 559B , CF 1731C , CF1109B)
    iOS系统崩溃的捕获
    vue静态资源的引用(相对路径,绝对路径,@,~的一些笔记,以图片引入为例,含在线演示)
    Flink从Kafka写入mysql
    统一SQL 支持Oracle到LightDB-Oracle特性转换
    详解IPD需求分析工具$APPEALS
    Windows运行多个Tomcat
    【虹科ELPRO - EMS系统】实现苏州某医药仓库温湿度自动监测 - 100% GxP合规(下)
    Flutter 应用启动从闪屏页短暂黑屏再到第一个页面
  • 原文地址:https://blog.csdn.net/bianliuzhu/article/details/126874967