From e32fbe02102fe80db29f73c26496a40852032354 Mon Sep 17 00:00:00 2001 From: Bentley O'Kane-Chase Date: Wed, 23 Oct 2024 06:31:23 +1000 Subject: [PATCH] fix(vue): incorrect view rendered when using router.go(-n) (#29877) resolves #28201 This PR fixes the navigation issue related to `router.go` that was identified in issue #28201. After working on this issue I realised that @xxllxhdj has already created a PR for this in #29847. While their fix is great, I have added tests to replicate the issue, reused existing code and `undefined` will be returned in unexpected situations - which matches the existing functionality. ## What is the current behavior? If a user navigates from `/home` -> `/pageA` -> `/pageB` -> `/pageC` -> back to `/pageB` -> then `router.go(-2)` is called the URL will be updated to `/home` correctly, but the app will try to render `/pageA`. This happens for any delta < -1. ## What is the new behavior? The app will correctly render `/pageA`, which matches the URL. ## Does this introduce a breaking change? - [ ] Yes - [X] No --------- Co-authored-by: xxllxhdj <12881488+xxllxhdj@users.noreply.github.com> --- .../__tests__/locationHistory.spec.ts | 21 +++++++++++++++++++ packages/vue-router/src/locationHistory.ts | 14 +++++-------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/packages/vue-router/__tests__/locationHistory.spec.ts b/packages/vue-router/__tests__/locationHistory.spec.ts index fe7f94e723..196dcc75d8 100644 --- a/packages/vue-router/__tests__/locationHistory.spec.ts +++ b/packages/vue-router/__tests__/locationHistory.spec.ts @@ -84,4 +84,25 @@ describe('Location History', () => { expect(locationHistory.canGoBack(1, 0, 1)).toEqual(true); expect(locationHistory.canGoBack(2, 0, 1)).toEqual(false); }); + + it('should correctly find the last location', () => { + const [home, pageA, pageB, pageC] = [ + { pathname: '/home' }, + { pathname: '/page-a', pushedByRoute: '/home' }, + { pathname: '/page-b', pushedByRoute: '/page-a' }, + { pathname: '/page-c', pushedByRoute: '/page-b' }, + ]; + + locationHistory.add(home); + locationHistory.add(pageA); + locationHistory.add(pageB); + locationHistory.add(pageC); + + expect(locationHistory.findLastLocation(pageB)).toEqual(pageA); + expect(locationHistory.findLastLocation(pageB, -2)).toEqual(home); + + expect(locationHistory.findLastLocation(pageC)).toEqual(pageB); + expect(locationHistory.findLastLocation(pageC, -2)).toEqual(pageA); + expect(locationHistory.findLastLocation(pageC, -3)).toEqual(home); + }); }); diff --git a/packages/vue-router/src/locationHistory.ts b/packages/vue-router/src/locationHistory.ts index f48499254e..9e12afd799 100644 --- a/packages/vue-router/src/locationHistory.ts +++ b/packages/vue-router/src/locationHistory.ts @@ -239,15 +239,11 @@ export const createLocationHistory = () => { } } } - if (delta < -1) { - return locationHistory[locationHistory.length - 1 + delta]; - } else { - for (let i = locationHistory.length - 2; i >= 0; i--) { - const ri = locationHistory[i]; - if (ri) { - if (ri.pathname === routeInfo.pushedByRoute) { - return ri; - } + for (let i = locationHistory.length - 2; i >= 0; i--) { + const ri = locationHistory[i]; + if (ri) { + if (ri.pathname === routeInfo.pushedByRoute) { + return locationHistory[i + 1 + delta] } } }