Skip to content

Commit c8228f0

Browse files
load deferred props on every page swap (#2024)
1 parent 45a987d commit c8228f0

File tree

6 files changed

+35
-4
lines changed

6 files changed

+35
-4
lines changed

packages/core/src/eventHandler.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@ import { fireNavigateEvent } from './events'
33
import { history } from './history'
44
import { page as currentPage } from './page'
55
import { Scroll } from './scroll'
6-
import { GlobalEvent, GlobalEventNames, GlobalEventResult } from './types'
6+
import { GlobalEvent, GlobalEventNames, GlobalEventResult, InternalEvent } from './types'
77
import { hrefToUrl } from './url'
88

9-
type InternalEvent = 'missingHistoryItem'
109
class EventHandler {
1110
protected internalListeners: {
1211
event: InternalEvent
@@ -54,7 +53,7 @@ class EventHandler {
5453
this.fireInternalEvent('missingHistoryItem')
5554
}
5655

57-
protected fireInternalEvent(event: InternalEvent): void {
56+
public fireInternalEvent(event: InternalEvent): void {
5857
this.internalListeners.filter((listener) => listener.event === event).forEach((listener) => listener.listener())
5958
}
6059

packages/core/src/page.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { eventHandler } from './eventHandler'
12
import { fireNavigateEvent } from './events'
23
import { history } from './history'
34
import { Scroll } from './scroll'
@@ -82,6 +83,8 @@ class CurrentPage {
8283
Scroll.reset(page)
8384
}
8485

86+
eventHandler.fireInternalEvent('loadDeferredProps')
87+
8588
if (!replace) {
8689
fireNavigateEvent(page)
8790
}

packages/core/src/router.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export class Router {
5959
}
6060
})
6161

62-
eventHandler.onGlobalEvent('navigate', () => {
62+
eventHandler.on('loadDeferredProps', () => {
6363
this.loadDeferredProps()
6464
})
6565
}

packages/core/src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ export type GlobalEventCallback<TEventName extends GlobalEventNames> = (
196196
...params: GlobalEventParameters<TEventName>
197197
) => GlobalEventResult<TEventName>
198198

199+
export type InternalEvent = 'missingHistoryItem' | 'loadDeferredProps'
200+
199201
export type VisitCallbacks = {
200202
onCancelToken: { ({ cancel }: { cancel: VoidFunction }): void }
201203
onBefore: GlobalEventCallback<'before'>

packages/vue3/test-app/Pages/DeferredProps/Page1.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,6 @@ defineProps<{
2222
{{ bar }}
2323
</Deferred>
2424

25+
<Link href="/deferred-props/page-1">Page 1</Link>
2526
<Link href="/deferred-props/page-2">Page 2</Link>
2627
</template>

tests/deferred-props.spec.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,29 @@ test('we are not caching deferred props after reload', async ({ page }) => {
6262
await expect(page.getByText('foo value')).toBeVisible()
6363
await expect(page.getByText('bar value')).toBeVisible()
6464
})
65+
66+
test('props will re-defer if a link is clicked to go to the same page again', async ({ page }) => {
67+
await page.goto('/deferred-props/page-1')
68+
69+
await expect(page.getByText('Loading foo...')).toBeVisible()
70+
await expect(page.getByText('Loading bar...')).toBeVisible()
71+
72+
await page.waitForResponse(page.url())
73+
74+
await expect(page.getByText('Loading foo...')).not.toBeVisible()
75+
await expect(page.getByText('Loading bar...')).not.toBeVisible()
76+
await expect(page.getByText('foo value')).toBeVisible()
77+
await expect(page.getByText('bar value')).toBeVisible()
78+
79+
await clickAndWaitForResponse(page, 'Page 1', '/deferred-props/page-1')
80+
81+
await expect(page.getByText('Loading foo...')).toBeVisible()
82+
await expect(page.getByText('Loading bar...')).toBeVisible()
83+
84+
await page.waitForResponse(page.url())
85+
86+
await expect(page.getByText('Loading foo...')).not.toBeVisible()
87+
await expect(page.getByText('Loading bar...')).not.toBeVisible()
88+
await expect(page.getByText('foo value')).toBeVisible()
89+
await expect(page.getByText('bar value')).toBeVisible()
90+
})

0 commit comments

Comments
 (0)