Skip to content

Commit 92aa5bb

Browse files
authored
Deferred API updates (#9070)
* chore: remove Deferrable/ResolvedDeferrable types for raw Promises * feat: support deferred arrays * chore:" remove typings from Deferred and useDeferredData To be added back in once we figur eout typing for useLoaderData in 6.5 * Handle deferred render errors at the boundary * internal renames * do not handle fallback render errors in deferred error boundary * Remove Suspense from inside Deferred * Rename test files to align casing * Update changeset for Suspense removal * Support deferred(promise) * Change deferred typings from any -> unknown * Add changeset: * Bump bundle * add tests for data memory router arrays/single deferreds
1 parent 6ac05b4 commit 92aa5bb

File tree

15 files changed

+811
-450
lines changed

15 files changed

+811
-450
lines changed

.changeset/light-months-argue.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,17 @@ function loader() {
1919
};
2020

2121
// In your route element, grab the values from useLoaderData and render them
22-
// with <Deferred>
22+
// with <Deferred> inside a <Suspense> boundary
2323
function DeferredPage() {
2424
let data = useLoaderData();
2525
return (
2626
<>
2727
<p>Critical Data: {data.critical}</p>
28-
<Deferred
29-
value={data.lazy}
30-
fallbackElement={<p>Loading...</p>}
31-
errorElement={<RenderDeferredError />}>
32-
<RenderDeferredData />
33-
</Deferred>
28+
<Suspense fallback={<p>Loading...</p>}>
29+
<Deferred value={data.lazy} errorElement={<RenderDeferredError />}>
30+
<RenderDeferredData />
31+
</Deferred>
32+
</Suspense>
3433
</>
3534
);
3635
}
@@ -57,9 +56,11 @@ function DeferredPage() {
5756
return (
5857
<>
5958
<p>Critical Data: {data.critical}</p>
60-
<Deferred value={data.lazy} fallbackElement={<p>Loading...</p>}>
61-
{(data) => <p>{data}</p>}
62-
</Deferred>
59+
<Suspense fallback={<p>Loading...</p>}>
60+
<Deferred value={data.lazy} errorElement={<RenderDeferredError />}>
61+
{(data) => <p>{data}</p>}
62+
</Deferred>
63+
</Suspense>
6364
</>
6465
);
6566
}

.changeset/new-kiwis-burn.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
"react-router": patch
3+
"@remix-run/router": patch
4+
---
5+
6+
Deferred API Updates
7+
8+
- Removes `<Suspense>` from inside `<Deferred>`, requires users to render their own suspense boundaries
9+
- Updates `Deferred` to use a true error boundary to catch render errors as well as data errors
10+
- Support array and single promise usages
11+
- `return deferred([ await critical(), lazy() ])`
12+
- `return deferred(lazy())`
13+
- Remove `Deferrable`/`ResolvedDeferrable` in favor of raw `Promise`'s and `Awaited`
14+
- Remove generics from `useDeferredData` until `useLoaderData` generic is decided in 6.5

examples/data-router/src/App.tsx

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import React from "react";
22
import {
33
type ActionFunction,
4-
type Deferrable,
54
type LoaderFunction,
65
DataBrowserRouter,
76
Deferred,
@@ -238,11 +237,11 @@ function Todo() {
238237
interface DeferredRouteLoaderData {
239238
critical1: string;
240239
critical2: string;
241-
lazyResolved: Deferrable<string>;
242-
lazy1: Deferrable<string>;
243-
lazy2: Deferrable<string>;
244-
lazy3: Deferrable<string>;
245-
lazyError: Deferrable<string>;
240+
lazyResolved: Promise<string>;
241+
lazy1: Promise<string>;
242+
lazy2: Promise<string>;
243+
lazy3: Promise<string>;
244+
lazyError: Promise<string>;
246245
}
247246

248247
const rand = () => Math.round(Math.random() * 100);
@@ -270,28 +269,35 @@ function DeferredPage() {
270269
<div>
271270
<p>{data.critical1}</p>
272271
<p>{data.critical2}</p>
273-
<Deferred
274-
value={data.lazyResolved}
275-
fallbackElement={<p>should not see me!</p>}
276-
>
277-
<RenderDeferredData />
278-
</Deferred>
279-
<Deferred value={data.lazy1} fallbackElement={<p>loading 1...</p>}>
280-
<RenderDeferredData />
281-
</Deferred>
282-
<Deferred value={data.lazy2} fallbackElement={<p>loading 2...</p>}>
283-
<RenderDeferredData />
284-
</Deferred>
285-
<Deferred value={data.lazy3} fallbackElement={<p>loading 3...</p>}>
286-
{(data) => <p>{data}</p>}
287-
</Deferred>
288-
<Deferred
289-
value={data.lazyError}
290-
fallbackElement={<p>loading (error)...</p>}
291-
errorElement={<RenderDeferredError />}
292-
>
293-
<RenderDeferredData />
294-
</Deferred>
272+
273+
<React.Suspense fallback={<p>should not see me!</p>}>
274+
<Deferred value={data.lazyResolved}>
275+
<RenderDeferredData />
276+
</Deferred>
277+
</React.Suspense>
278+
279+
<React.Suspense fallback={<p>loading 1...</p>}>
280+
<Deferred value={data.lazy1}>
281+
<RenderDeferredData />
282+
</Deferred>
283+
</React.Suspense>
284+
285+
<React.Suspense fallback={<p>loading 2...</p>}>
286+
<Deferred value={data.lazy2}>
287+
<RenderDeferredData />
288+
</Deferred>
289+
</React.Suspense>
290+
291+
<React.Suspense fallback={<p>loading 3...</p>}>
292+
<Deferred value={data.lazy3}>{(data) => <p>{data}</p>}</Deferred>
293+
</React.Suspense>
294+
295+
<React.Suspense fallback={<p>loading (error)...</p>}>
296+
<Deferred value={data.lazyError} errorElement={<RenderDeferredError />}>
297+
<RenderDeferredData />
298+
</Deferred>
299+
</React.Suspense>
300+
295301
<Outlet />
296302
</div>
297303
);
@@ -314,9 +320,11 @@ function DeferredChild() {
314320
return (
315321
<div>
316322
<p>{data.critical}</p>
317-
<Deferred value={data.lazy} fallbackElement={<p>loading child...</p>}>
318-
<RenderDeferredData />
319-
</Deferred>
323+
<React.Suspense fallback={<p>loading child...</p>}>
324+
<Deferred value={data.lazy}>
325+
<RenderDeferredData />
326+
</Deferred>
327+
</React.Suspense>
320328
<Form method="post">
321329
<button type="submit" name="key" value="value">
322330
Submit

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@
101101
},
102102
"filesize": {
103103
"packages/router/dist/router.js": {
104-
"none": "95 kB"
104+
"none": "96 kB"
105105
},
106106
"packages/react-router/dist/react-router.production.min.js": {
107107
"none": "11 kB"
File renamed without changes.

packages/react-router-dom/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ export type {
6363
ActionFunctionArgs,
6464
DataMemoryRouterProps,
6565
DataRouteMatch,
66-
Deferrable,
6766
DeferredProps,
6867
Fetcher,
6968
Hash,

packages/react-router-native/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ export type {
2727
ActionFunctionArgs,
2828
DataMemoryRouterProps,
2929
DataRouteMatch,
30-
Deferrable,
3130
DeferredProps,
3231
Fetcher,
3332
Hash,

packages/react-router/CHANGELOG.md

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,11 @@
2626
return (
2727
<>
2828
<p>Critical Data: {data.critical}</p>
29-
<Deferred
30-
value={data.lazy}
31-
fallbackElement={<p>Loading...</p>}
32-
errorElement={<RenderDeferredError />}>
33-
<RenderDeferredData />
34-
</Deferred>
29+
<Suspense fallback={<p>Loading...</p>}>
30+
<Deferred value={data.lazy} errorElement={<RenderDeferredError />}>
31+
<RenderDeferredData />
32+
</Deferred>
33+
</Suspense>
3534
</>
3635
);
3736
}
@@ -58,9 +57,11 @@
5857
return (
5958
<>
6059
<p>Critical Data: {data.critical}</p>
61-
<Deferred value={data.lazy} fallbackElement={<p>Loading...</p>}>
62-
{(data) => <p>{data}</p>}
63-
</Deferred>
60+
<Suspense fallback={<p>Loading...</p>}>
61+
<Deferred value={data.lazy} errorElement={<RenderDeferredError />}>
62+
{(data) => <p>{data}</p>}
63+
</Deferred>
64+
</Suspense>
6465
</>
6566
);
6667
}

0 commit comments

Comments
 (0)