路由多次执行相同push|replace问题
一、场景
项目中实现商品搜索功能,用户可以从导航栏点击分类或搜索框输入关键词搜索商品,通过编程式导航携带参数给Search页面。此时用户可能多次点击同一分类或者搜索同一关键词,导致出现NavigationDuplicated问题。
二、原因
声明式导航并没有这个问题,因为vue-router底层已经处理好了。
而编程式导航进行路由跳转时会出现,因为最新的vue-router引入promise。
由于push方法返回promise对象,需要传递成功和失败两个参数,代码编写时push没有传递,如果没有通过参数指定成功或者失败回调函数,就返回一个promise来指定成功/失败的回调。且内部会判断如果要跳转的路径和参数都没有变化,会抛出一个失败的promise。
三、解决方法
需要给push方法传递成功和失败的回调函数,由于多次传递比较麻烦,因此可以直接重写push和replace方法(router配置文件中修改)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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,() => { }, () => { }) } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!