Skip to content

Commit 26f2db2

Browse files
authored
[2.x] Fix <Deferred /> in Svelte adapter (#2037)
* Fix deferred reactivity * Update React and Vue3 tests * Update comment
1 parent a95409f commit 26f2db2

File tree

5 files changed

+24
-11
lines changed

5 files changed

+24
-11
lines changed

packages/react/test-app/Pages/DeferredProps/Page1.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import { Deferred, Link, usePage } from '@inertiajs/react'
33
const Foo = () => {
44
const { foo } = usePage().props
55

6-
return foo
6+
return foo.text
77
}
88

99
const Bar = () => {
1010
const { bar } = usePage().props
1111

12-
return bar
12+
return bar.text
1313
}
1414

1515
export default () => {

packages/svelte/src/components/Deferred.svelte

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,29 @@
11
<script lang="ts">
22
import { page } from '../index'
3+
import { onDestroy } from 'svelte'
34
45
export let data: string | string[]
56
67
const keys = Array.isArray(data) ? data : [data]
8+
let loaded = false
9+
10+
const unsubscribe = page.subscribe(({ props }) => {
11+
// Ensures the slot isn't loaded before the deferred props are available
12+
window.queueMicrotask(() => {
13+
loaded = keys.every((key) => typeof props[key] !== 'undefined')
14+
})
15+
})
16+
17+
onDestroy(() => {
18+
unsubscribe()
19+
})
720
821
if (!$$slots.fallback) {
922
throw new Error('`<Deferred>` requires a `<svelte:fragment slot="fallback">` slot')
1023
}
1124
</script>
1225

13-
{#if keys.every((key) => $page.props[key] !== undefined)}
26+
{#if loaded}
1427
<slot />
1528
{:else}
1629
<slot name="fallback" />

packages/svelte/test-app/Pages/DeferredProps/Page1.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99
<svelte:fragment slot="fallback">
1010
<div>Loading foo...</div>
1111
</svelte:fragment>
12-
{foo}
12+
{foo.text}
1313
</Deferred>
1414

1515
<Deferred data="bar">
1616
<svelte:fragment slot="fallback">
1717
<div>Loading bar...</div>
1818
</svelte:fragment>
19-
{bar}
19+
{bar.text}
2020
</Deferred>
2121

2222
<a href="/deferred-props/page-2" use:inertia>Page 2</a>

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
import { Deferred, Link } from '@inertiajs/vue3'
33
44
defineProps<{
5-
foo?: string
6-
bar?: string
5+
foo?: {text: string }
6+
bar?: {text: string }
77
}>()
88
</script>
99

@@ -12,14 +12,14 @@ defineProps<{
1212
<template #fallback>
1313
<div>Loading foo...</div>
1414
</template>
15-
{{ foo }}
15+
{{ foo?.text }}
1616
</Deferred>
1717

1818
<Deferred data="bar">
1919
<template #fallback>
2020
<div>Loading bar...</div>
2121
</template>
22-
{{ bar }}
22+
{{ bar?.text }}
2323
</Deferred>
2424

2525
<Link href="/deferred-props/page-1">Page 1</Link>

tests/app/server.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,8 +263,8 @@ app.get('/deferred-props/page-1', (req, res) => {
263263
inertia.render(req, res, {
264264
component: 'DeferredProps/Page1',
265265
props: {
266-
foo: req.headers['x-inertia-partial-data']?.includes('foo') ? 'foo value' : undefined,
267-
bar: req.headers['x-inertia-partial-data']?.includes('bar') ? 'bar value' : undefined,
266+
foo: req.headers['x-inertia-partial-data']?.includes('foo') ? { text: 'foo value' } : undefined,
267+
bar: req.headers['x-inertia-partial-data']?.includes('bar') ? { text: 'bar value' } : undefined,
268268
},
269269
}),
270270
500,

0 commit comments

Comments
 (0)