点击vue路由跳转,控制台报错:Avoided redundant navigation to current location: “/xxxxxx“解决方法

一、描述问题

在使用this.$router.push跳转页面时候,重复点击菜单引起路由重复报错

比如当前页面显示区是路由组件‘/cats’,重复点击按钮进行this.$router.push跳转,要跳转的组件仍然是‘/cats’,那么控制就会报如下错误:

二、报错原因

由于 vue-router3.0 及以上版本回调形式改成Promise API的形式了,返回的是一个Promise 。也是说 push和replace都是Promise类型了。

而Promise的回调函数resolve和reject,必须传其中一个,否则会报错。如果路由地址跳转相同,且没有捕获到错误,控制台始终会出现上图所出现的问题。​

三、解决方法

1、安装vue-router3.0以下版本

先卸载3.0以上版本然后再安装旧版本

npm i @vue-router2.8.0

2、为每一个Promise添加一个回调函数

缺点:每个路由跳转都要添加回调函数

this.$router.push({name: 'Cats',}, () => {})

3、修改VueRouter原型对象上的push/replace方法

在router/index.js文件中添加如下代码

// 获取原型对象push函数
const originalPush = VueRouter.prototype.push// 获取原型对象replace函数
const originalReplace = VueRouter.prototype.replace// 修改原型对象中的push函数
VueRouter.prototype.push = function push(location){return originalPush.call(this , location).catch(err=>err)
}// 修改原型对象中的replace函数
VueRouter.prototype.replace = function replace(location){return originalReplace.call(this , location).catch(err=>err)
}

四、原理分析

const originalReplace = VueRouter.prototype.replaceVueRouter.prototype.replace = function replace(location){return originalReplace.call(this , location).catch(err=>err)
}

location :一个保存了当前要跳转路径的对象;

call()函数:可以在调用函数的同时改变this的指向,常用于实现继承,
两个参数:
this:由于call处于原型对象内部,所以此处this指向的是当前VueRouter的实例对象;而originalPush指向的是VueRouter.prototype.push,旨在于调用当前VueRouter实例对象中的push方法;
location:在方法调用时传入获取到的location。

catch:链式调用catch方法,目的是在方法执行时,捕获错误。
在js机制中,catch捕获到Exception时,代码还会继续向下执行。所以此处的catch未作任何操作,代码也会继续向下执行,和抛给浏览器的错误其实时一致的

五、额外补充

1、路由导航方式

声明式 编程式
<router-link :to="..."> $router.push(...)

编程式导航:即 $router.push$router.replace$router.forward()$router.back()$router.go()

2、Promise函数

① Promise是一个构造函数
可以使用new 创建一个Promise实例 //eg:const p = new Promise()
每一个Promise实例对象代表一个异步操作

② Promise.prototype上包含一个.then()方法
每一个new Promise()构造函数得到的实例对象都可以通过原型链的方式访问到.then()方法 //eg:p.then()

③ .then()方法用来预先指定成功或失败的回调函数
p.then(成功回调,失败回调)
调用.then()方法时,成功的回调函数是必选的,失败回调是可选的

Vue路由导航报错:NavigationDuplicated: Avoided redundant navigation to current location解决方法相关推荐

  1. 报错:Avoided redundant navigation to current location: “/login“.完美解决

    需求: 登陆之后才能查看主页面,否则跳转至登录页 遇到的问题: 一开始是打算直接在拦截器跳转路由的,发现会报错Avoided redundant navigation to current locat ...

  2. vue-router 报错Error: Avoided redundant navigation to current location: “/index/user“解决方式

    问题 使用ivew Menu 制作的导航菜单,连续点击同一个导航时报错 该报错不影响功能 当前地址 http://localhost:8080/#/transfer/index 连续点击–信息录入 报 ...

  3. 解决Vue报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location

    问题描述:重复点击导航时,控制台出现报错 ,虽然不影响功能使用,但也不能坐视不管. 解决 Vue 重复点击相同路由,出现 Uncaught (in promise) NavigationDuplica ...

  4. 解决报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location: “

    报错内容: vue-router.esm.js?68cf:2065 Uncaught (in promise) NavigationDuplicated: Avoided redundant navi ...

  5. vue 跳转报 NavigationDuplicated: Avoided redundant navigation to current location: “/to-do“.

    错误提示:NavigationDuplicated: Avoided redundant navigation to current location: "/to-do". 提示这 ...

  6. vue2里面的Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location

    编程式导航跳转到当前路由(参数不变),多次执行就会在控制台出现如下结果: 怎么解决: (1)最有效--重写push.replace 在router-index.js中添加: // 重写push.rep ...

  7. Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location: “/deta

    Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location: " ...

  8. 解决Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location问题

    在Vue路由中遇到Error: Avoided redundant navigation to current location:xxxx:错误,意思是路由重复 在router文件夹下的index.j ...

  9. vue重复点击路由报错,解决NavigationDuplicated: Avoided redundant navigation to current location: 问题

    vue项目中重复加载当前路由会报错, 解决方法:找到项目中的router文件,在里面添加代码,修正Vue原型上的push和replace方法 (注意vue-router的引入名称) // 缓存原型上的 ...

  10. vue编程式导航跳转到当前路由多次执行抛出NavigationDuplicated: Avoided redundant navigation to current location:

    为什么? push方法会返回一个Promise对象,内部会进行跳转成功或失败的回调 解决方法 只需在push方法末尾传递两个成功和失败的回调函数,可以捕获到当前的错误,可以解决.但是此种方法治标不治本 ...

最新文章

  1. 02.Apollo配置中心整合spring cloud zuul
  2. HashMap HashTable和ConcurrentHashMap的区别
  3. 这些你都了解么------程序员跳槽法则
  4. 关于STM32 MDK中USE_STDPERIPH_DRIVER问题的解释
  5. 无线网sdn服务器,什么是SDN,SDN网络与传统网络对比
  6. OpenYurt 联手 eKuiper,解决 IoT 场景下边缘流数据处理难题
  7. bzoj2597: [Wc2007]剪刀石头布
  8. c 命令导出数据到mysql_MySQL命令行导出数据库
  9. LeetCode 1658. 将 x 减到 0 的最小操作数(哈希)
  10. 彻底扔掉PostMan了,这套国产替代方案是真的香…
  11. 推荐系统 | 引用量超过1000的52篇经典论文
  12. 开发用的一些工具(更新中)
  13. surface 3安装android x86,Android-x86 9.0-r2稳定版发布 修复Microsoft Surface 3音频问题
  14. oj 小黑华丽的逆袭机会
  15. Java 开发必看的 5个 Github 开源项目
  16. yml格式写法中容易遇到的坑
  17. 【MATLAB】MATLAB数值计算
  18. 基于Python+Django+mysql的实验室设备管理系统
  19. ChatGPT Network Error 在使用chatGPT的过程中回答到一半显示网络错误
  20. 网易互娱2017实习生招聘在线笔试第一场-1电子数字

热门文章

  1. Fluent Meshing的workflow方法
  2. html5制作涂鸦板,HTML5实现涂鸦板
  3. 计算机专业毕业设计流程,计算机专业毕业设计答辩流程
  4. 设备报废鉴定怎么做?
  5. 生物信息学_测序技术(一)DNA测序
  6. 防盗报警器c语言程序,基于单片机的汽车防盗报警系统的设计毕业论文.doc
  7. pandas 第八章 文本数据
  8. QT5 自定义窗口的详细设计方案
  9. MIMIC数据库简介
  10. C/C++和Lua混合编程