1.错误示例

如在多次点击搜索按钮进行编程式路由跳转时控制台会出现报错NavigationDuplicated

2.分析错误产生原因

原因是在vue-router3.1.0之后, 引入了promise的语法。如果路由跳转时里面的参数没有改变,会返回一个失败的promise,如果不去处理这个失败的promise,就会抛出这个错误。而声明式路由导航不会出现这种错误,因为Vue在底层已经处理好了。

3.解决办法

方法一

我们可以在使用push和replace进行跳转时,手动的传入成功与失败的回调。

this.$router.push({name: "search",params: {......},query: {......},},() => {},//成功回调() => {},//失败回调
);

这种方法适用于页面较少,使用编程式路由跳转次数较小的情况下使用。如果页面较多,可以对VueRouter的push和replace方法进行重写。

方法二

重写push和replace方法
在路由文件中写入以下代码

//重写push|replace方法
//先把VueRouter原型对象的push和replace保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;//重写push
VueRouter.prototype.push = function (location, resolve, reject) {//如果用户传入了成功与失败的回调if (resolve && reject) {originPush.call(this, location, resolve, reject);//注意此处需要使用call方法来改变originPush的this指向,因为需要保证重定义的push方法的上下文相同} else {originPush.call(this,location,() => {},() => {});}// 如果用户没传入就手动设置传入
};//重写push
VueRouter.prototype.replace = function (location, resolve, reject) {//如果用户传入了成功与失败的回调if (resolve && reject) {originReplace.call(this, location, resolve, reject);//注意此处需要使用call方法来改变originPush的this指向,因为需要保证重定义的push方法的上下文相同} else {originReplace.call(this,location,() => {},() => {});}// 如果用户没传入就手动设置传入
};```
这样就完成了push与replace的重写,使用后发现连续点击跳转,控制台也不会出现报错的情况了。

编程式路由导航连续跳转出现NavigationDuplicated报错的问题相关推荐

  1. 编程式路由导航和withRouter

    编程式路由导航 如果想使用按钮实现路由跳转,有两种形式,可回退和不可回退两种: 由于history被放在props中,可以直接通过this.props.history的push和replace改变 可 ...

  2. Vue 编程式路由导航

    文章目录 router- link的replace属性 编程式路由导航 缓存路由组件 两个新的生命钩子 router- link的replace属性 1.作用:控制路由跳转时操作浏览器历史记录的模式 ...

  3. Vue -- 编程式路由导航

    文章目录 1. 声明式导航 & 编程式导航 1.1 声明式导航 1.2 编程式导航 2. vue-router 中的编程式导航 API 2.1 常用的编程式导航 API 2.2 \$route ...

  4. Vue声明式路由导航和编程式路由导航的优缺点及实现方法

    文章目录 前言 路由实现 1.目标 2.前置条件 <1>安装vue-router插件 <2>写个用于转跳的组件页 <3>写路由文件 <4>写路由锚点 3 ...

  5. Day31_编程式路由导航

    提出需求 1.观察this.$router 上有什么   (push   replace) 2.实现this$router.push查看 1>在message组件里面: 3.实现this$rou ...

  6. Vue教程6【完结】【vue-router】路由,路由传参,编程式路由导航,缓存路由组件,路由守卫,路由模式,vue ui组件库

    vue-router 了解 vue插件库,用来实现SPA应用(单页面) 整个页面只有一个完整的页面 点击页面中导航链接,不会刷新页面,只做局部更新 数据通过ajax请求 路由的理解 一组映射关系(ke ...

  7. 【React路由】编程式路由导航和withRouter的使用——push / replace

    文章目录

  8. vue中路由传参方式之二(this.$router.push进行编程式路由跳转传参)

    this.$router.push进行编程式路由跳转传参 router中路由配置 组件home点击传参 组件homeDetails接受参数 router中路由配置 params第一种传参路由配置 {p ...

  9. vue-router常见问题解决方案。(滚轴回到顶部、页面跳转同一页面报错、手机电脑端路由跳转)

    当页面跳转后,侧边滚轴会还是一个页面位置 //路由跳转后,页面回到顶部 router.afterEach(() => {document.body.scrollTop = 0;document. ...

最新文章

  1. MySQL慢查询日志分析(二)
  2. Linux定时备份mysql数据库
  3. MySQL · 性能优化· InnoDB buffer pool flush策略漫谈
  4. 007 Android之Broadcast Receiver
  5. struts2 如何跳转html5,在线HTML编辑器——ueditor,跟struts2结合
  6. 产品经理,你们做产品最孤独的时刻是什么?
  7. 鲨鱼 抓包 oracle,ubuntu下网络抓包工具wireshark tcpdump的使用
  8. java snychronized_Java synchronized同步线程机制(三) | 学步园
  9. Centos7装NVIDIA显卡驱动(GPU)
  10. java 1.5.0 gcj_CentOS安装JAVA后JAVA版本不对的问题
  11. 史上最全Spring面试71题与答案
  12. atitit.atiOrmStoreService 框架的原理与设计 part1  概述与新特性
  13. SpringMVC-数据处理(三)
  14. java按两列输出_有没有一种简单的方法可以将两列输出到Java中的控制台? - java...
  15. Linux的setup命令启动服务名称和功能
  16. 数学与泛型编程:高效编程的奥秘pdf_Java 泛型与类型擦除
  17. 封装自己的DB类(PHP)
  18. python调用通达信函数_如何把通达信公式变成python
  19. python 英语翻译_python实现在线翻译功能
  20. 谷歌浏览器网页截屏插件工具下载与安装——FireShot

热门文章

  1. IO编程,真的很简单
  2. IDEA 统计Statistic插件下载地址
  3. Qt 精美的button合集
  4. 词法分析器设计与实现
  5. JAVA - 变量作用域
  6. 用Python实现语音播报
  7. linux将一段时间内文件压缩,在 Linux 上压缩文件的 5 种方法
  8. Python requests库Proxy代理问题
  9. 基于51的交通灯Proteus仿真设计
  10. git导入项目时,git出现10054错误