首页 > 其他分享 >路由多次执行相同push|replace问题

路由多次执行相同push|replace问题

时间:2022-09-25 10:58:58浏览次数:45  
标签:resovled rejected replace location vueRouter push 路由

一、场景

项目中实现商品搜索功能,用户可以从导航栏点击分类或搜索框输入关键词搜索商品,通过编程式导航携带参数给Search页面。此时用户可能多次点击同一分类或者搜索同一关键词,导致出现NavigationDuplicated问题。

二、原因

声明式导航并没有这个问题,因为vue-router底层已经处理好了。

而编程式导航进行路由跳转时会出现,因为最新的vue-router引入promise。

由于push方法返回promise对象,需要传递成功和失败两个参数,代码编写时push没有传递,如果没有通过参数指定成功或者失败回调函数,就返回一个promise来指定成功/失败的回调。且内部会判断如果要跳转的路径和参数都没有变化,会抛出一个失败的promise。

三、解决方法

需要给push方法传递成功和失败的回调函数,由于多次传递比较麻烦,因此可以直接重写push和replace方法(router配置文件中修改)

import Vue from "vue"
import vueRouter from "vue-router"

Vue.use(vueRouter)

import routes from '@/router/routes'
import { getToken,removeToken } from "@/utils/token"
import store from "@/store"
//保存原来的push方法和replace方法
const originPush = vueRouter.prototype.push
const originReplace = vueRouter.prototype.replace

vueRouter.prototype.push = function (location, resovled, rejected) {
    if (resovled && rejected) {
        originPush.call(this, location,resovled, rejected)
    } else {
        originPush.call(this,location, () => { }, () => { })
    }
}
vueRouter.prototype.replace = function (location, resovled, rejected) {
    if (resovled && rejected) {
        originReplace.call(this, location,resovled, rejected)
    } else {
        originReplace.call(this, location,() => { }, () => { })
    }
}

  

 

标签:resovled,rejected,replace,location,vueRouter,push,路由
From: https://www.cnblogs.com/cxuep/p/16727378.html

相关文章

  • 路由协议
    最短路径常用的有两种方法,一种是Bellman-Ford算法,一种是Dijkstra算法。一、距离矢量路由算法第一大类的算法称为距离矢量路由(distancevectorrouting)。它是基于Bell......
  • 项目中的问题 路由跳转和axios封装
     1.路由问题,以及路由重定向 2.axios封装请求 3.获取验证码和登录 4.路由跳转和项目中的问题  5.  ......
  • 点击事件和路由跳转
     工作常用的点击事件1.@click="goDetail"2.在方法中使用 methods:{//跳转到登录页   goDetail(){     this.$router.push("/login")   ......
  • 5.动态路由协议和RIP
    静态路由——环回口R1-f0/0:32.32.12.1—R2-f0/0:32.32.12.2环回口:两设备相连,没有第三台设备但还要验证自己的静态路由时,在路由器上取的逻辑的虚拟接口,一般用来测试使......
  • RTMP_PUSH协议的通道IP不正确是什么原因?该如何解决?
    EasyCVR视频融合云平台基于云边端一体化架构,兼容性高、拓展性强,可支持多类型设备、多协议方式接入,包括国标GB/T28181、RTMP、RTSP/Onvif协议,以及厂家的私有协议,如:海康Ehome......
  • Express路由参数
    //引入express框架constexpress=require('express');constbodyParser=require('body-parser');//创建网站服务器constapp=express();app.get('/index/:i......
  • vue3路由简单配置
    路由目录各文件内容【router/index】import{createRouter,createWebHashHistory,createWebHistory}from"vue-router";import{scrollBehavior}from"./helpe......
  • 静态路由添加: 地址 0 跳 2 出现故障;终端先卡死后瘫痪,虚拟机操作不受影响
    ───────────────────────────────────────────────────────────────────────────────......
  • 小乌龟(TortoiseGit)在push时总是要求输入密码的解决办法
    当你在用TortoiseGit拉取或者提交代码的时候,可能遇到过git小乌龟总是要让你输入密码,无法拉取、提交代码,见下图。怎么解决这个问题? 1.复制私钥文件id_rsa,将复制的文件......
  • 路由器、集线器、交换机分别工作在OSI七层协议模型的哪一层
    路由器三层(网络层);集线器一层(物理层);普通交换机二层(数据链路层)。现在也有工作在第三层的交换机。OSI七层网络模型由下至上为1至7层,分别为物理层(Physicallayer),数......