From 53cce995d100a757d17d5079fda5aa4c3f169a74 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Thu, 28 Mar 2019 18:01:01 +0100 Subject: [PATCH] fix(normalizeLocation): create a copy with named locations (#2286) * fix(normalizeLocation): create a copy with non normalized named locations Fix #2121 * test(nested-routes): add e2e test for implicit params * chore(lint): fix --- examples/nested-routes/app.js | 20 ++++++++++++++++---- src/util/location.js | 4 +++- test/e2e/specs/nested-routes.js | 9 ++++++++- test/unit/specs/location.spec.js | 9 +++++++++ 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/examples/nested-routes/app.js b/examples/nested-routes/app.js index 420389275..1d3b011ac 100644 --- a/examples/nested-routes/app.js +++ b/examples/nested-routes/app.js @@ -36,15 +36,22 @@ const Quy = { ` } -const Quux = { template: '
quux
' } -const Zap = { template: '

zap

{{ $route.params.zapId }}
' } +const Quux = { + template: `
quuxgo to quuy
` +} +const Quuy = { template: '
quuy
' } +const Zap = { + template: '

zap

{{ $route.params.zapId }}
' +} const router = new VueRouter({ mode: 'history', base: __dirname, routes: [ { path: '/', redirect: '/parent' }, - { path: '/parent', component: Parent, + { + path: '/parent', + component: Parent, children: [ // an empty path will be treated as the default, e.g. // components rendered at /parent: Root -> Parent -> Default @@ -65,7 +72,10 @@ const router = new VueRouter({ { path: 'qux/:quxId', component: Qux, - children: [{ path: 'quux', name: 'quux', component: Quux }] + children: [ + { path: 'quux', name: 'quux', component: Quux }, + { path: 'quuy', name: 'quuy', component: Quuy } + ] }, { path: 'quy/:quyId', component: Quy }, @@ -91,6 +101,8 @@ new Vue({
  • /parent/zap
  • /parent/zap/1
  • { params: { zapId: 2 }} (relative params)
  • +
  • /parent/qux/1/quux
  • +
  • /parent/qux/2/quux
  • diff --git a/src/util/location.js b/src/util/location.js index 364e6fc0c..176b50141 100644 --- a/src/util/location.js +++ b/src/util/location.js @@ -15,8 +15,10 @@ export function normalizeLocation ( ): Location { let next: Location = typeof raw === 'string' ? { path: raw } : raw // named target - if (next.name || next._normalized) { + if (next._normalized) { return next + } else if (next.name) { + return extend({}, raw) } // relative params diff --git a/test/e2e/specs/nested-routes.js b/test/e2e/specs/nested-routes.js index e5a8f16a1..ef52a251d 100644 --- a/test/e2e/specs/nested-routes.js +++ b/test/e2e/specs/nested-routes.js @@ -3,7 +3,7 @@ module.exports = { browser .url('http://localhost:8080/nested-routes/') .waitForElementVisible('#app', 1000) - .assert.count('li a', 9) + .assert.count('li a', 11) .assert.urlEquals('http://localhost:8080/nested-routes/parent') .assert.containsText('.view', 'Parent') .assert.containsText('.view', 'default') @@ -70,6 +70,13 @@ module.exports = { return (zapId === '2') }, null, 'relative params') + .click('li:nth-child(10) a') + .assert.urlEquals('http://localhost:8080/nested-routes/parent/qux/1/quux') + .click('li:nth-child(11) a') + .assert.urlEquals('http://localhost:8080/nested-routes/parent/qux/2/quux') + .click('.nested-child a') + .assert.urlEquals('http://localhost:8080/nested-routes/parent/qux/2/quuy') + // check initial visit .url('http://localhost:8080/nested-routes/parent/foo') .waitForElementVisible('#app', 1000) diff --git a/test/unit/specs/location.spec.js b/test/unit/specs/location.spec.js index 0b44bae9e..e333421b1 100644 --- a/test/unit/specs/location.spec.js +++ b/test/unit/specs/location.spec.js @@ -120,5 +120,14 @@ describe('Location utils', () => { const loc2 = normalizeLocation(loc1) expect(loc1).toBe(loc2) }) + + it('creates copies when not normalized', () => { + const l1 = { name: 'foo' } + expect(normalizeLocation(l1)).not.toBe(l1) + const l2 = { path: '/foo' } + expect(normalizeLocation(l2)).not.toBe(l2) + const l3 = { path: '/foo', query: { foo: 'foo' }} + expect(normalizeLocation(l3)).not.toBe(l3) + }) }) })