]> git.ipfire.org Git - thirdparty/vuejs/router.git/commitdiff
fix(guards): remove registered update guards after leaving
authorEduardo San Martin Morote <posva13@gmail.com>
Tue, 21 Jul 2020 11:49:41 +0000 (13:49 +0200)
committerEduardo San Martin Morote <posva13@gmail.com>
Tue, 21 Jul 2020 12:35:11 +0000 (14:35 +0200)
__tests__/guards/onBeforeRouteUpdate.spec.ts
src/navigationGuards.ts
src/router.ts

index 4762d3691060ba624d970f7b60ea9c11f8957484..ba6560dce9fb691707383e0b771ee76b6cccc07f 100644 (file)
@@ -52,4 +52,47 @@ describe('onBeforeRouteUpdate', () => {
     await router.push('/foo?q')
     expect(spy).toHaveBeenCalledTimes(1)
   })
+
+  it('removes update guards when leaving', async () => {
+    expect.assertions(3)
+    const spy = jest
+      .fn()
+      .mockImplementation(function (this: any, to, from, next) {
+        expect(typeof this.counter).toBe('number')
+        next()
+      })
+    const WithLeave = defineComponent({
+      template: `text`,
+      // we use data to check if the context is the right one because saving `this` in a variable logs a few warnings
+      data: () => ({ counter: 0 }),
+      setup() {
+        onBeforeRouteUpdate(spy)
+      },
+    })
+
+    const router = createRouter({
+      history: createMemoryHistory(),
+      routes: [
+        { path: '/', component },
+        { path: '/foo', component: WithLeave as any },
+      ],
+    })
+    const app = createApp({
+      template: `
+      <router-view />
+      `,
+    })
+    app.use(router)
+    const rootEl = document.createElement('div')
+    document.body.appendChild(rootEl)
+    app.mount(rootEl)
+
+    await router.isReady()
+    await router.push('/foo')
+    await router.push('/foo?q')
+    await router.push('/')
+    await router.push('/foo')
+    await router.push('/foo?q')
+    expect(spy).toHaveBeenCalledTimes(2)
+  })
 })
index d1d61f34d4186804177dee347f4cdba96ab3d822..53bee1046c320ae9e33002c83a8bb90358ac0cd6 100644 (file)
@@ -260,16 +260,3 @@ function isRouteComponent(
     '__vccOpts' in component
   )
 }
-
-/**
- * 1. beforeRouteEnter callbacks
- * 2. Dictionary of instances per view name
- */
-export type GuardManagerEntry = [
-  NavigationGuardNextCallback[],
-  Record<string, ComponentPublicInstance | undefined | null>
-]
-
-export function createGuardManager() {
-  return new Map<RouteRecordNormalized, GuardManagerEntry>()
-}
index 8674405a3d7b0bcb15084f202c9f16e3d99f492f..c1d8d804e39168eda4d56799a87829d885ee72b5 100644 (file)
@@ -691,6 +691,7 @@ export function createRouter(options: RouterOptions): Router {
     for (const record of leavingRecords) {
       // remove registered guards from removed matched records
       record.leaveGuards = []
+      record.updateGuards = []
       // free the references
       record.instances = {}
       record.enterCallbacks = {}