UNPKG

51.2 kBMarkdownView Raw
1# `react-router`
2
3## 7.1.5
4
5### Patch Changes
6
7- Fix regression introduced in `7.1.4` via [#12800](https://github.com/remix-run/react-router/pull/12800) that caused issues navigating to hash routes inside splat routes for applications using Lazy Route Discovery (`patchRoutesOnNavigation`) ([#12927](https://github.com/remix-run/react-router/pull/12927))
8
9## 7.1.4
10
11### Patch Changes
12
13- Internal reorg to clean up some duplicated route module types ([#12799](https://github.com/remix-run/react-router/pull/12799))
14- Properly handle status codes that cannot have a body in single fetch responses (204, etc.) ([#12760](https://github.com/remix-run/react-router/pull/12760))
15- Stop erroring on resource routes that return raw strings/objects and instead serialize them as `text/plain` or `application/json` responses ([#12848](https://github.com/remix-run/react-router/pull/12848))
16 - This only applies when accessed as a resource route without the `.data` extension
17 - When accessed from a Single Fetch `.data` request, they will still be encoded via `turbo-stream`
18- Optimize Lazy Route Discovery path discovery to favor a single `querySelectorAll` call at the `body` level instead of many calls at the sub-tree level ([#12731](https://github.com/remix-run/react-router/pull/12731))
19- Properly bubble headers as `errorHeaders` when throwing a `data()` result ([#12846](https://github.com/remix-run/react-router/pull/12846))
20 - Avoid duplication of `Set-Cookie` headers could be duplicated if also returned from `headers`
21- Optimize route matching by skipping redundant `matchRoutes` calls when possible ([#12800](https://github.com/remix-run/react-router/pull/12800))
22
23## 7.1.3
24
25_No changes_
26
27## 7.1.2
28
29### Patch Changes
30
31- Fix issue with fetcher data cleanup in the data layer on fetcher unmount ([#12681](https://github.com/remix-run/react-router/pull/12681))
32- Do not rely on `symbol` for filtering out `redirect` responses from loader data ([#12694](https://github.com/remix-run/react-router/pull/12694))
33
34 Previously, some projects were getting type checking errors like:
35
36 ```ts
37 error TS4058: Return type of exported function has or is using name 'redirectSymbol' from external module "node_modules/..." but cannot be named.
38 ```
39
40 Now that `symbol`s are not used for the `redirect` response type, these errors should no longer be present.
41
42## 7.1.1
43
44_No changes_
45
46## 7.1.0
47
48### Patch Changes
49
50- Throw unwrapped single fetch redirect to align with pre-single fetch behavior ([#12506](https://github.com/remix-run/react-router/pull/12506))
51- Ignore redirects when inferring loader data types ([#12527](https://github.com/remix-run/react-router/pull/12527))
52- Remove `<Link prefetch>` warning which suffers from false positives in a lazy route discovery world ([#12485](https://github.com/remix-run/react-router/pull/12485))
53
54## 7.0.2
55
56### Patch Changes
57
58- temporarily only use one build in export map so packages can have a peer dependency on react router ([#12437](https://github.com/remix-run/react-router/pull/12437))
59- Generate wide `matches` and `params` types for current route and child routes ([#12397](https://github.com/remix-run/react-router/pull/12397))
60
61 At runtime, `matches` includes child route matches and `params` include child route path parameters.
62 But previously, we only generated types for parent routes in `matches`; for `params`, we only considered the parent routes and the current route.
63 To align our generated types more closely to the runtime behavior, we now generate more permissive, wider types when accessing child route information.
64
65## 7.0.1
66
67_No changes_
68
69## 7.0.0
70
71### Major Changes
72
73- Remove the original `defer` implementation in favor of using raw promises via single fetch and `turbo-stream`. This removes these exports from React Router: ([#11744](https://github.com/remix-run/react-router/pull/11744))
74
75 - `defer`
76 - `AbortedDeferredError`
77 - `type TypedDeferredData`
78 - `UNSAFE_DeferredData`
79 - `UNSAFE_DEFERRED_SYMBOL`,
80
81- - Collapse `@remix-run/router` into `react-router` ([#11505](https://github.com/remix-run/react-router/pull/11505))
82 - Collapse `react-router-dom` into `react-router`
83 - Collapse `@remix-run/server-runtime` into `react-router`
84 - Collapse `@remix-run/testing` into `react-router`
85
86- Remove single\_fetch future flag. ([#11522](https://github.com/remix-run/react-router/pull/11522))
87
88- Drop support for Node 16, React Router SSR now requires Node 18 or higher ([#11391](https://github.com/remix-run/react-router/pull/11391))
89
90- Remove `future.v7_startTransition` flag ([#11696](https://github.com/remix-run/react-router/pull/11696))
91
92- - Expose the underlying router promises from the following APIs for compsition in React 19 APIs: ([#11521](https://github.com/remix-run/react-router/pull/11521))
93 - `useNavigate()`
94 - `useSubmit`
95 - `useFetcher().load`
96 - `useFetcher().submit`
97 - `useRevalidator.revalidate`
98
99- Remove `future.v7_normalizeFormMethod` future flag ([#11697](https://github.com/remix-run/react-router/pull/11697))
100
101- For Remix consumers migrating to React Router, the `crypto` global from the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) is now required when using cookie and session APIs. This means that the following APIs are provided from `react-router` rather than platform-specific packages: ([#11837](https://github.com/remix-run/react-router/pull/11837))
102
103 - `createCookie`
104 - `createCookieSessionStorage`
105 - `createMemorySessionStorage`
106 - `createSessionStorage`
107
108 For consumers running older versions of Node, the `installGlobals` function from `@remix-run/node` has been updated to define `globalThis.crypto`, using [Node's `require('node:crypto').webcrypto` implementation.](https://nodejs.org/api/webcrypto.html)
109
110 Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
111
112 - `createCookieFactory`
113 - `createSessionStorageFactory`
114 - `createCookieSessionStorageFactory`
115 - `createMemorySessionStorageFactory`
116
117- Imports/Exports cleanup ([#11840](https://github.com/remix-run/react-router/pull/11840))
118
119 - Removed the following exports that were previously public API from `@remix-run/router`
120 - types
121 - `AgnosticDataIndexRouteObject`
122 - `AgnosticDataNonIndexRouteObject`
123 - `AgnosticDataRouteMatch`
124 - `AgnosticDataRouteObject`
125 - `AgnosticIndexRouteObject`
126 - `AgnosticNonIndexRouteObject`
127 - `AgnosticRouteMatch`
128 - `AgnosticRouteObject`
129 - `TrackedPromise`
130 - `unstable_AgnosticPatchRoutesOnMissFunction`
131 - `Action` -> exported as `NavigationType` via `react-router`
132 - `Router` exported as `DataRouter` to differentiate from RR's `<Router>`
133 - API
134 - `getToPathname` (`@private`)
135 - `joinPaths` (`@private`)
136 - `normalizePathname` (`@private`)
137 - `resolveTo` (`@private`)
138 - `stripBasename` (`@private`)
139 - `createBrowserHistory` -> in favor of `createBrowserRouter`
140 - `createHashHistory` -> in favor of `createHashRouter`
141 - `createMemoryHistory` -> in favor of `createMemoryRouter`
142 - `createRouter`
143 - `createStaticHandler` -> in favor of wrapper `createStaticHandler` in RR Dom
144 - `getStaticContextFromError`
145 - Removed the following exports that were previously public API from `react-router`
146 - `Hash`
147 - `Pathname`
148 - `Search`
149
150- update minimum node version to 18 ([#11690](https://github.com/remix-run/react-router/pull/11690))
151
152- Remove `future.v7_prependBasename` from the ionternalized `@remix-run/router` package ([#11726](https://github.com/remix-run/react-router/pull/11726))
153
154- Migrate Remix type generics to React Router ([#12180](https://github.com/remix-run/react-router/pull/12180))
155
156 - These generics are provided for Remix v2 migration purposes
157 - These generics and the APIs they exist on should be considered informally deprecated in favor of the new `Route.*` types
158 - Anyone migrating from React Router v6 should probably not leverage these new generics and should migrate straight to the `Route.*` types
159 - For React Router v6 users, these generics are new and should not impact your app, with one exception
160 - `useFetcher` previously had an optional generic (used primarily by Remix v2) that expected the data type
161 - This has been updated in v7 to expect the type of the function that generates the data (i.e., `typeof loader`/`typeof action`)
162 - Therefore, you should update your usages:
163 - ❌ `useFetcher<LoaderData>()`
164 - ✅ `useFetcher<typeof loader>()`
165
166- Remove `future.v7_throwAbortReason` from internalized `@remix-run/router` package ([#11728](https://github.com/remix-run/react-router/pull/11728))
167
168- Add `exports` field to all packages ([#11675](https://github.com/remix-run/react-router/pull/11675))
169
170- node package no longer re-exports from react-router ([#11702](https://github.com/remix-run/react-router/pull/11702))
171
172- renamed RemixContext to FrameworkContext ([#11705](https://github.com/remix-run/react-router/pull/11705))
173
174- updates the minimum React version to 18 ([#11689](https://github.com/remix-run/react-router/pull/11689))
175
176- PrefetchPageDescriptor replaced by PageLinkDescriptor ([#11960](https://github.com/remix-run/react-router/pull/11960))
177
178- - Consolidate types previously duplicated across `@remix-run/router`, `@remix-run/server-runtime`, and `@remix-run/react` now that they all live in `react-router` ([#12177](https://github.com/remix-run/react-router/pull/12177))
179 - Examples: `LoaderFunction`, `LoaderFunctionArgs`, `ActionFunction`, `ActionFunctionArgs`, `DataFunctionArgs`, `RouteManifest`, `LinksFunction`, `Route`, `EntryRoute`
180 - The `RouteManifest` type used by the "remix" code is now slightly stricter because it is using the former `@remix-run/router` `RouteManifest`
181 - `Record<string, Route> -> Record<string, Route | undefined>`
182 - Removed `AppData` type in favor of inlining `unknown` in the few locations it was used
183 - Removed `ServerRuntimeMeta*` types in favor of the `Meta*` types they were duplicated from
184
185- - Remove the `future.v7_partialHydration` flag ([#11725](https://github.com/remix-run/react-router/pull/11725))
186 - This also removes the `<RouterProvider fallbackElement>` prop
187 - To migrate, move the `fallbackElement` to a `hydrateFallbackElement`/`HydrateFallback` on your root route
188 - Also worth nothing there is a related breaking changer with this future flag:
189 - Without `future.v7_partialHydration` (when using `fallbackElement`), `state.navigation` was populated during the initial load
190 - With `future.v7_partialHydration`, `state.navigation` remains in an `"idle"` state during the initial load
191
192- Remove `v7_relativeSplatPath` future flag ([#11695](https://github.com/remix-run/react-router/pull/11695))
193
194- Drop support for Node 18, update minimum Node vestion to 20 ([#12171](https://github.com/remix-run/react-router/pull/12171))
195
196 - Remove `installGlobals()` as this should no longer be necessary
197
198- Remove remaining future flags ([#11820](https://github.com/remix-run/react-router/pull/11820))
199
200 - React Router `v7_skipActionErrorRevalidation`
201 - Remix `v3_fetcherPersist`, `v3_relativeSplatPath`, `v3_throwAbortReason`
202
203- rename createRemixStub to createRoutesStub ([#11692](https://github.com/remix-run/react-router/pull/11692))
204
205- Remove `@remix-run/router` deprecated `detectErrorBoundary` option in favor of `mapRouteProperties` ([#11751](https://github.com/remix-run/react-router/pull/11751))
206
207- Add `react-router/dom` subpath export to properly enable `react-dom` as an optional `peerDependency` ([#11851](https://github.com/remix-run/react-router/pull/11851))
208
209 - This ensures that we don't blindly `import ReactDOM from "react-dom"` in `<RouterProvider>` in order to access `ReactDOM.flushSync()`, since that would break `createMemoryRouter` use cases in non-DOM environments
210 - DOM environments should import from `react-router/dom` to get the proper component that makes `ReactDOM.flushSync()` available:
211 - If you are using the Vite plugin, use this in your `entry.client.tsx`:
212 - `import { HydratedRouter } from 'react-router/dom'`
213 - If you are not using the Vite plugin and are manually calling `createBrowserRouter`/`createHashRouter`:
214 - `import { RouterProvider } from "react-router/dom"`
215
216- Remove `future.v7_fetcherPersist` flag ([#11731](https://github.com/remix-run/react-router/pull/11731))
217
218- Update `cookie` dependency to `^1.0.1` - please see the [release notes](https://github.com/jshttp/cookie/releases) for any breaking changes ([#12172](https://github.com/remix-run/react-router/pull/12172))
219
220### Minor Changes
221
222- - Add support for `prerender` config in the React Router vite plugin, to support existing SSG use-cases ([#11539](https://github.com/remix-run/react-router/pull/11539))
223 - You can use the `prerender` config to pre-render your `.html` and `.data` files at build time and then serve them statically at runtime (either from a running server or a CDN)
224 - `prerender` can either be an array of string paths, or a function (sync or async) that returns an array of strings so that you can dynamically generate the paths by talking to your CMS, etc.
225
226 ```ts
227 // react-router.config.ts
228 import type { Config } from "@react-router/dev/config";
229
230 export default {
231 async prerender() {
232 let slugs = await fakeGetSlugsFromCms();
233 // Prerender these paths into `.html` files at build time, and `.data`
234 // files if they have loaders
235 return ["/", "/about", ...slugs.map((slug) => `/product/${slug}`)];
236 },
237 } satisfies Config;
238
239 async function fakeGetSlugsFromCms() {
240 await new Promise((r) => setTimeout(r, 1000));
241 return ["shirt", "hat"];
242 }
243 ```
244
245- Params, loader data, and action data as props for route component exports ([#11961](https://github.com/remix-run/react-router/pull/11961))
246
247 ```tsx
248 export default function Component({ params, loaderData, actionData }) {}
249
250 export function HydrateFallback({ params }) {}
251 export function ErrorBoundary({ params, loaderData, actionData }) {}
252 ```
253
254- Remove duplicate `RouterProvider` impliementations ([#11679](https://github.com/remix-run/react-router/pull/11679))
255
256- ### Typesafety improvements ([#12019](https://github.com/remix-run/react-router/pull/12019))
257
258 React Router now generates types for each of your route modules.
259 You can access those types by importing them from `./+types.<route filename without extension>`.
260 For example:
261
262 ```ts
263 // app/routes/product.tsx
264 import type * as Route from "./+types.product";
265
266 export function loader({ params }: Route.LoaderArgs) {}
267
268 export default function Component({ loaderData }: Route.ComponentProps) {}
269 ```
270
271 This initial implementation targets type inference for:
272
273 - `Params` : Path parameters from your routing config in `routes.ts` including file-based routing
274 - `LoaderData` : Loader data from `loader` and/or `clientLoader` within your route module
275 - `ActionData` : Action data from `action` and/or `clientAction` within your route module
276
277 In the future, we plan to add types for the rest of the route module exports: `meta`, `links`, `headers`, `shouldRevalidate`, etc.
278 We also plan to generate types for typesafe `Link`s:
279
280 ```tsx
281 <Link to="/products/:id" params={{ id: 1 }} />
282 // ^^^^^^^^^^^^^ ^^^^^^^^^
283 // typesafe `to` and `params` based on the available routes in your app
284 ```
285
286 Check out our docs for more:
287
288 - [_Explanations > Type Safety_](https://reactrouter.com/dev/guides/explanation/type-safety)
289 - [_How-To > Setting up type safety_](https://reactrouter.com/dev/guides/how-to/setting-up-type-safety)
290
291- Stabilize `unstable_dataStrategy` ([#11969](https://github.com/remix-run/react-router/pull/11969))
292
293- Stabilize `unstable_patchRoutesOnNavigation` ([#11970](https://github.com/remix-run/react-router/pull/11970))
294
295### Patch Changes
296
297- No changes ([`506329c4e`](https://github.com/remix-run/react-router/commit/506329c4e2e7aba9837cbfa44df6103b49423745))
298
299- chore: re-enable development warnings through a `development` exports condition. ([#12269](https://github.com/remix-run/react-router/pull/12269))
300
301- Remove unstable upload handler. ([#12015](https://github.com/remix-run/react-router/pull/12015))
302
303- Remove unneeded dependency on @web3-storage/multipart-parser ([#12274](https://github.com/remix-run/react-router/pull/12274))
304
305- Fix redirects returned from loaders/actions using `data()` ([#12021](https://github.com/remix-run/react-router/pull/12021))
306
307- fix(react-router): (v7) fix static prerender of non-ascii characters ([#12161](https://github.com/remix-run/react-router/pull/12161))
308
309- Replace `substr` with `substring` ([#12080](https://github.com/remix-run/react-router/pull/12080))
310
311- Remove the deprecated `json` utility ([#12146](https://github.com/remix-run/react-router/pull/12146))
312
313 - You can use [`Response.json`](https://developer.mozilla.org/en-US/docs/Web/API/Response/json_static) if you still need to construct JSON responses in your app
314
315- Remove unneeded dependency on source-map ([#12275](https://github.com/remix-run/react-router/pull/12275))
316
317## 6.28.0
318
319### Minor Changes
320
321- - Log deprecation warnings for v7 flags ([#11750](https://github.com/remix-run/react-router/pull/11750))
322 - Add deprecation warnings to `json`/`defer` in favor of returning raw objects
323 - These methods will be removed in React Router v7
324
325### Patch Changes
326
327- Update JSDoc URLs for new website structure (add /v6/ segment) ([#12141](https://github.com/remix-run/react-router/pull/12141))
328- Updated dependencies:
329 - `@remix-run/router@1.21.0`
330
331## 6.27.0
332
333### Minor Changes
334
335- Stabilize `unstable_patchRoutesOnNavigation` ([#11973](https://github.com/remix-run/react-router/pull/11973))
336 - Add new `PatchRoutesOnNavigationFunctionArgs` type for convenience ([#11967](https://github.com/remix-run/react-router/pull/11967))
337- Stabilize `unstable_dataStrategy` ([#11974](https://github.com/remix-run/react-router/pull/11974))
338- Stabilize the `unstable_flushSync` option for navigations and fetchers ([#11989](https://github.com/remix-run/react-router/pull/11989))
339- Stabilize the `unstable_viewTransition` option for navigations and the corresponding `unstable_useViewTransitionState` hook ([#11989](https://github.com/remix-run/react-router/pull/11989))
340
341### Patch Changes
342
343- Fix bug when submitting to the current contextual route (parent route with an index child) when an `?index` param already exists from a prior submission ([#12003](https://github.com/remix-run/react-router/pull/12003))
344
345- Fix `useFormAction` bug - when removing `?index` param it would not keep other non-Remix `index` params ([#12003](https://github.com/remix-run/react-router/pull/12003))
346
347- Fix types for `RouteObject` within `PatchRoutesOnNavigationFunction`'s `patch` method so it doesn't expect agnostic route objects passed to `patch` ([#11967](https://github.com/remix-run/react-router/pull/11967))
348
349- Updated dependencies:
350 - `@remix-run/router@1.20.0`
351
352## 6.26.2
353
354### Patch Changes
355
356- Updated dependencies:
357 - `@remix-run/router@1.19.2`
358
359## 6.26.1
360
361### Patch Changes
362
363- Rename `unstable_patchRoutesOnMiss` to `unstable_patchRoutesOnNavigation` to match new behavior ([#11888](https://github.com/remix-run/react-router/pull/11888))
364- Updated dependencies:
365 - `@remix-run/router@1.19.1`
366
367## 6.26.0
368
369### Minor Changes
370
371- Add a new `replace(url, init?)` alternative to `redirect(url, init?)` that performs a `history.replaceState` instead of a `history.pushState` on client-side navigation redirects ([#11811](https://github.com/remix-run/react-router/pull/11811))
372
373### Patch Changes
374
375- Fix initial hydration behavior when using `future.v7_partialHydration` along with `unstable_patchRoutesOnMiss` ([#11838](https://github.com/remix-run/react-router/pull/11838))
376 - During initial hydration, `router.state.matches` will now include any partial matches so that we can render ancestor `HydrateFallback` components
377- Updated dependencies:
378 - `@remix-run/router@1.19.0`
379
380## 6.25.1
381
382No significant changes to this package were made in this release. [See the repo `CHANGELOG.md`](https://github.com/remix-run/react-router/blob/main/CHANGELOG.md) for an overview of all changes in v6.25.1.
383
384## 6.25.0
385
386### Minor Changes
387
388- Stabilize `future.unstable_skipActionErrorRevalidation` as `future.v7_skipActionErrorRevalidation` ([#11769](https://github.com/remix-run/react-router/pull/11769))
389 - When this flag is enabled, actions will not automatically trigger a revalidation if they return/throw a `Response` with a `4xx`/`5xx` status code
390 - You may still opt-into revalidation via `shouldRevalidate`
391 - This also changes `shouldRevalidate`'s `unstable_actionStatus` parameter to `actionStatus`
392
393### Patch Changes
394
395- Fix regression and properly decode paths inside `useMatch` so matches/params reflect decoded params ([#11789](https://github.com/remix-run/react-router/pull/11789))
396- Updated dependencies:
397 - `@remix-run/router@1.18.0`
398
399## 6.24.1
400
401### Patch Changes
402
403- When using `future.v7_relativeSplatPath`, properly resolve relative paths in splat routes that are children of pathless routes ([#11633](https://github.com/remix-run/react-router/pull/11633))
404- Updated dependencies:
405 - `@remix-run/router@1.17.1`
406
407## 6.24.0
408
409### Minor Changes
410
411- Add support for Lazy Route Discovery (a.k.a. Fog of War) ([#11626](https://github.com/remix-run/react-router/pull/11626))
412 - RFC: <https://github.com/remix-run/react-router/discussions/11113>
413 - `unstable_patchRoutesOnMiss` docs: <https://reactrouter.com/v6/routers/create-browser-router>
414
415### Patch Changes
416
417- Updated dependencies:
418 - `@remix-run/router@1.17.0`
419
420## 6.23.1
421
422### Patch Changes
423
424- allow undefined to be resolved with `<Await>` ([#11513](https://github.com/remix-run/react-router/pull/11513))
425- Updated dependencies:
426 - `@remix-run/router@1.16.1`
427
428## 6.23.0
429
430### Minor Changes
431
432- Add a new `unstable_dataStrategy` configuration option ([#11098](https://github.com/remix-run/react-router/pull/11098))
433 - This option allows Data Router applications to take control over the approach for executing route loaders and actions
434 - The default implementation is today's behavior, to fetch all loaders in parallel, but this option allows users to implement more advanced data flows including Remix single-fetch, middleware/context APIs, automatic loader caching, and more
435
436### Patch Changes
437
438- Updated dependencies:
439 - `@remix-run/router@1.16.0`
440
441## 6.22.3
442
443### Patch Changes
444
445- Updated dependencies:
446 - `@remix-run/router@1.15.3`
447
448## 6.22.2
449
450### Patch Changes
451
452- Updated dependencies:
453 - `@remix-run/router@1.15.2`
454
455## 6.22.1
456
457### Patch Changes
458
459- Fix encoding/decoding issues with pre-encoded dynamic parameter values ([#11199](https://github.com/remix-run/react-router/pull/11199))
460- Updated dependencies:
461 - `@remix-run/router@1.15.1`
462
463## 6.22.0
464
465### Patch Changes
466
467- Updated dependencies:
468 - `@remix-run/router@1.15.0`
469
470## 6.21.3
471
472### Patch Changes
473
474- Remove leftover `unstable_` prefix from `Blocker`/`BlockerFunction` types ([#11187](https://github.com/remix-run/react-router/pull/11187))
475
476## 6.21.2
477
478### Patch Changes
479
480- Updated dependencies:
481 - `@remix-run/router@1.14.2`
482
483## 6.21.1
484
485### Patch Changes
486
487- Fix bug with `route.lazy` not working correctly on initial SPA load when `v7_partialHydration` is specified ([#11121](https://github.com/remix-run/react-router/pull/11121))
488- Updated dependencies:
489 - `@remix-run/router@1.14.1`
490
491## 6.21.0
492
493### Minor Changes
494
495- Add a new `future.v7_relativeSplatPath` flag to implement a breaking bug fix to relative routing when inside a splat route. ([#11087](https://github.com/remix-run/react-router/pull/11087))
496
497 This fix was originally added in [#10983](https://github.com/remix-run/react-router/issues/10983) and was later reverted in [#11078](https://github.com/remix-run/react-router/pull/11078) because it was determined that a large number of existing applications were relying on the buggy behavior (see [#11052](https://github.com/remix-run/react-router/issues/11052))
498
499 **The Bug**
500 The buggy behavior is that without this flag, the default behavior when resolving relative paths is to _ignore_ any splat (`*`) portion of the current route path.
501
502 **The Background**
503 This decision was originally made thinking that it would make the concept of nested different sections of your apps in `<Routes>` easier if relative routing would _replace_ the current splat:
504
505 ```jsx
506 <BrowserRouter>
507 <Routes>
508 <Route path="/" element={<Home />} />
509 <Route path="dashboard/*" element={<Dashboard />} />
510 </Routes>
511 </BrowserRouter>
512 ```
513
514 Any paths like `/dashboard`, `/dashboard/team`, `/dashboard/projects` will match the `Dashboard` route. The dashboard component itself can then render nested `<Routes>`:
515
516 ```jsx
517 function Dashboard() {
518 return (
519 <div>
520 <h2>Dashboard</h2>
521 <nav>
522 <Link to="/">Dashboard Home</Link>
523 <Link to="team">Team</Link>
524 <Link to="projects">Projects</Link>
525 </nav>
526
527 <Routes>
528 <Route path="/" element={<DashboardHome />} />
529 <Route path="team" element={<DashboardTeam />} />
530 <Route path="projects" element={<DashboardProjects />} />
531 </Routes>
532 </div>
533 );
534 }
535 ```
536
537 Now, all links and route paths are relative to the router above them. This makes code splitting and compartmentalizing your app really easy. You could render the `Dashboard` as its own independent app, or embed it into your large app without making any changes to it.
538
539 **The Problem**
540
541 The problem is that this concept of ignoring part of a path breaks a lot of other assumptions in React Router - namely that `"."` always means the current location pathname for that route. When we ignore the splat portion, we start getting invalid paths when using `"."`:
542
543 ```jsx
544 // If we are on URL /dashboard/team, and we want to link to /dashboard/team:
545 function DashboardTeam() {
546 // ❌ This is broken and results in <a href="/dashboard">
547 return <Link to=".">A broken link to the Current URL</Link>;
548
549 // ✅ This is fixed but super unintuitive since we're already at /dashboard/team!
550 return <Link to="./team">A broken link to the Current URL</Link>;
551 }
552 ```
553
554 We've also introduced an issue that we can no longer move our `DashboardTeam` component around our route hierarchy easily - since it behaves differently if we're underneath a non-splat route, such as `/dashboard/:widget`. Now, our `"."` links will, properly point to ourself _inclusive of the dynamic param value_ so behavior will break from it's corresponding usage in a `/dashboard/*` route.
555
556 Even worse, consider a nested splat route configuration:
557
558 ```jsx
559 <BrowserRouter>
560 <Routes>
561 <Route path="dashboard">
562 <Route path="*" element={<Dashboard />} />
563 </Route>
564 </Routes>
565 </BrowserRouter>
566 ```
567
568 Now, a `<Link to=".">` and a `<Link to="..">` inside the `Dashboard` component go to the same place! That is definitely not correct!
569
570 Another common issue arose in Data Routers (and Remix) where any `<Form>` should post to it's own route `action` if you the user doesn't specify a form action:
571
572 ```jsx
573 let router = createBrowserRouter({
574 path: "/dashboard",
575 children: [
576 {
577 path: "*",
578 action: dashboardAction,
579 Component() {
580 // ❌ This form is broken! It throws a 405 error when it submits because
581 // it tries to submit to /dashboard (without the splat value) and the parent
582 // `/dashboard` route doesn't have an action
583 return <Form method="post">...</Form>;
584 },
585 },
586 ],
587 });
588 ```
589
590 This is just a compounded issue from the above because the default location for a `Form` to submit to is itself (`"."`) - and if we ignore the splat portion, that now resolves to the parent route.
591
592 **The Solution**
593 If you are leveraging this behavior, it's recommended to enable the future flag, move your splat to it's own route, and leverage `../` for any links to "sibling" pages:
594
595 ```jsx
596 <BrowserRouter>
597 <Routes>
598 <Route path="dashboard">
599 <Route index path="*" element={<Dashboard />} />
600 </Route>
601 </Routes>
602 </BrowserRouter>
603
604 function Dashboard() {
605 return (
606 <div>
607 <h2>Dashboard</h2>
608 <nav>
609 <Link to="..">Dashboard Home</Link>
610 <Link to="../team">Team</Link>
611 <Link to="../projects">Projects</Link>
612 </nav>
613
614 <Routes>
615 <Route path="/" element={<DashboardHome />} />
616 <Route path="team" element={<DashboardTeam />} />
617 <Route path="projects" element={<DashboardProjects />} />
618 </Router>
619 </div>
620 );
621 }
622 ```
623
624 This way, `.` means "the full current pathname for my route" in all cases (including static, dynamic, and splat routes) and `..` always means "my parents pathname".
625
626### Patch Changes
627
628- Properly handle falsy error values in ErrorBoundary's ([#11071](https://github.com/remix-run/react-router/pull/11071))
629- Updated dependencies:
630 - `@remix-run/router@1.14.0`
631
632## 6.20.1
633
634### Patch Changes
635
636- Revert the `useResolvedPath` fix for splat routes due to a large number of applications that were relying on the buggy behavior (see <https://github.com/remix-run/react-router/issues/11052#issuecomment-1836589329>). We plan to re-introduce this fix behind a future flag in the next minor version. ([#11078](https://github.com/remix-run/react-router/pull/11078))
637- Updated dependencies:
638 - `@remix-run/router@1.13.1`
639
640## 6.20.0
641
642### Minor Changes
643
644- Export the `PathParam` type from the public API ([#10719](https://github.com/remix-run/react-router/pull/10719))
645
646### Patch Changes
647
648- Fix bug with `resolveTo` in splat routes ([#11045](https://github.com/remix-run/react-router/pull/11045))
649 - This is a follow up to [#10983](https://github.com/remix-run/react-router/pull/10983) to handle the few other code paths using `getPathContributingMatches`
650 - This removes the `UNSAFE_getPathContributingMatches` export from `@remix-run/router` since we no longer need this in the `react-router`/`react-router-dom` layers
651- Updated dependencies:
652 - `@remix-run/router@1.13.0`
653
654## 6.19.0
655
656### Minor Changes
657
658- Add `unstable_flushSync` option to `useNavigate`/`useSumbit`/`fetcher.load`/`fetcher.submit` to opt-out of `React.startTransition` and into `ReactDOM.flushSync` for state updates ([#11005](https://github.com/remix-run/react-router/pull/11005))
659- Remove the `unstable_` prefix from the [`useBlocker`](https://reactrouter.com/v6/hooks/use-blocker) hook as it's been in use for enough time that we are confident in the API. We do not plan to remove the prefix from `unstable_usePrompt` due to differences in how browsers handle `window.confirm` that prevent React Router from guaranteeing consistent/correct behavior. ([#10991](https://github.com/remix-run/react-router/pull/10991))
660
661### Patch Changes
662
663- Fix `useActionData` so it returns proper contextual action data and not _any_ action data in the tree ([#11023](https://github.com/remix-run/react-router/pull/11023))
664
665- Fix bug in `useResolvedPath` that would cause `useResolvedPath(".")` in a splat route to lose the splat portion of the URL path. ([#10983](https://github.com/remix-run/react-router/pull/10983))
666
667 - ⚠️ This fixes a quite long-standing bug specifically for `"."` paths inside a splat route which incorrectly dropped the splat portion of the URL. If you are relative routing via `"."` inside a splat route in your application you should double check that your logic is not relying on this buggy behavior and update accordingly.
668
669- Updated dependencies:
670 - `@remix-run/router@1.12.0`
671
672## 6.18.0
673
674### Patch Changes
675
676- Fix the `future` prop on `BrowserRouter`, `HashRouter` and `MemoryRouter` so that it accepts a `Partial<FutureConfig>` instead of requiring all flags to be included. ([#10962](https://github.com/remix-run/react-router/pull/10962))
677- Updated dependencies:
678 - `@remix-run/router@1.11.0`
679
680## 6.17.0
681
682### Patch Changes
683
684- Fix `RouterProvider` `future` prop type to be a `Partial<FutureConfig>` so that not all flags must be specified ([#10900](https://github.com/remix-run/react-router/pull/10900))
685- Updated dependencies:
686 - `@remix-run/router@1.10.0`
687
688## 6.16.0
689
690### Minor Changes
691
692- In order to move towards stricter TypeScript support in the future, we're aiming to replace current usages of `any` with `unknown` on exposed typings for user-provided data. To do this in Remix v2 without introducing breaking changes in React Router v6, we have added generics to a number of shared types. These continue to default to `any` in React Router and are overridden with `unknown` in Remix. In React Router v7 we plan to move these to `unknown` as a breaking change. ([#10843](https://github.com/remix-run/react-router/pull/10843))
693 - `Location` now accepts a generic for the `location.state` value
694 - `ActionFunctionArgs`/`ActionFunction`/`LoaderFunctionArgs`/`LoaderFunction` now accept a generic for the `context` parameter (only used in SSR usages via `createStaticHandler`)
695 - The return type of `useMatches` (now exported as `UIMatch`) accepts generics for `match.data` and `match.handle` - both of which were already set to `unknown`
696- Move the `@private` class export `ErrorResponse` to an `UNSAFE_ErrorResponseImpl` export since it is an implementation detail and there should be no construction of `ErrorResponse` instances in userland. This frees us up to export a `type ErrorResponse` which correlates to an instance of the class via `InstanceType`. Userland code should only ever be using `ErrorResponse` as a type and should be type-narrowing via `isRouteErrorResponse`. ([#10811](https://github.com/remix-run/react-router/pull/10811))
697- Export `ShouldRevalidateFunctionArgs` interface ([#10797](https://github.com/remix-run/react-router/pull/10797))
698- Removed private/internal APIs only required for the Remix v1 backwards compatibility layer and no longer needed in Remix v2 (`_isFetchActionRedirect`, `_hasFetcherDoneAnything`) ([#10715](https://github.com/remix-run/react-router/pull/10715))
699
700### Patch Changes
701
702- Updated dependencies:
703 - `@remix-run/router@1.9.0`
704
705## 6.15.0
706
707### Minor Changes
708
709- Add's a new `redirectDocument()` function which allows users to specify that a redirect from a `loader`/`action` should trigger a document reload (via `window.location`) instead of attempting to navigate to the redirected location via React Router ([#10705](https://github.com/remix-run/react-router/pull/10705))
710
711### Patch Changes
712
713- Ensure `useRevalidator` is referentially stable across re-renders if revalidations are not actively occurring ([#10707](https://github.com/remix-run/react-router/pull/10707))
714- Updated dependencies:
715 - `@remix-run/router@1.8.0`
716
717## 6.14.2
718
719### Patch Changes
720
721- Updated dependencies:
722 - `@remix-run/router@1.7.2`
723
724## 6.14.1
725
726### Patch Changes
727
728- Fix loop in `unstable_useBlocker` when used with an unstable blocker function ([#10652](https://github.com/remix-run/react-router/pull/10652))
729- Fix issues with reused blockers on subsequent navigations ([#10656](https://github.com/remix-run/react-router/pull/10656))
730- Updated dependencies:
731 - `@remix-run/router@1.7.1`
732
733## 6.14.0
734
735### Patch Changes
736
737- Strip `basename` from locations provided to `unstable_useBlocker` functions to match `useLocation` ([#10573](https://github.com/remix-run/react-router/pull/10573))
738- Fix `generatePath` when passed a numeric `0` value parameter ([#10612](https://github.com/remix-run/react-router/pull/10612))
739- Fix `unstable_useBlocker` key issues in `StrictMode` ([#10573](https://github.com/remix-run/react-router/pull/10573))
740- Fix `tsc --skipLibCheck:false` issues on React 17 ([#10622](https://github.com/remix-run/react-router/pull/10622))
741- Upgrade `typescript` to 5.1 ([#10581](https://github.com/remix-run/react-router/pull/10581))
742- Updated dependencies:
743 - `@remix-run/router@1.7.0`
744
745## 6.13.0
746
747### Minor Changes
748
749- Move [`React.startTransition`](https://react.dev/reference/react/startTransition) usage behind a [future flag](https://reactrouter.com/v6/guides/api-development-strategy) to avoid issues with existing incompatible `Suspense` usages. We recommend folks adopting this flag to be better compatible with React concurrent mode, but if you run into issues you can continue without the use of `startTransition` until v7. Issues usually boils down to creating net-new promises during the render cycle, so if you run into issues you should either lift your promise creation out of the render cycle or put it behind a `useMemo`. ([#10596](https://github.com/remix-run/react-router/pull/10596))
750
751 Existing behavior will no longer include `React.startTransition`:
752
753 ```jsx
754 <BrowserRouter>
755 <Routes>{/*...*/}</Routes>
756 </BrowserRouter>
757
758 <RouterProvider router={router} />
759 ```
760
761 If you wish to enable `React.startTransition`, pass the future flag to your component:
762
763 ```jsx
764 <BrowserRouter future={{ v7_startTransition: true }}>
765 <Routes>{/*...*/}</Routes>
766 </BrowserRouter>
767
768 <RouterProvider router={router} future={{ v7_startTransition: true }}/>
769 ```
770
771### Patch Changes
772
773- Work around webpack/terser `React.startTransition` minification bug in production mode ([#10588](https://github.com/remix-run/react-router/pull/10588))
774
775## 6.12.1
776
777> \[!WARNING]
778> Please use version `6.13.0` or later instead of `6.12.1`. This version suffers from a `webpack`/`terser` minification issue resulting in invalid minified code in your resulting production bundles which can cause issues in your application. See [#10579](https://github.com/remix-run/react-router/issues/10579) for more details.
779
780### Patch Changes
781
782- Adjust feature detection of `React.startTransition` to fix webpack + react 17 compilation error ([#10569](https://github.com/remix-run/react-router/pull/10569))
783
784## 6.12.0
785
786### Minor Changes
787
788- Wrap internal router state updates with `React.startTransition` if it exists ([#10438](https://github.com/remix-run/react-router/pull/10438))
789
790### Patch Changes
791
792- Updated dependencies:
793 - `@remix-run/router@1.6.3`
794
795## 6.11.2
796
797### Patch Changes
798
799- Fix `basename` duplication in descendant `<Routes>` inside a `<RouterProvider>` ([#10492](https://github.com/remix-run/react-router/pull/10492))
800- Updated dependencies:
801 - `@remix-run/router@1.6.2`
802
803## 6.11.1
804
805### Patch Changes
806
807- Fix usage of `Component` API within descendant `<Routes>` ([#10434](https://github.com/remix-run/react-router/pull/10434))
808- Fix bug when calling `useNavigate` from `<Routes>` inside a `<RouterProvider>` ([#10432](https://github.com/remix-run/react-router/pull/10432))
809- Fix usage of `<Navigate>` in strict mode when using a data router ([#10435](https://github.com/remix-run/react-router/pull/10435))
810- Updated dependencies:
811 - `@remix-run/router@1.6.1`
812
813## 6.11.0
814
815### Patch Changes
816
817- Log loader/action errors to the console in dev for easier stack trace evaluation ([#10286](https://github.com/remix-run/react-router/pull/10286))
818- Fix bug preventing rendering of descendant `<Routes>` when `RouterProvider` errors existed ([#10374](https://github.com/remix-run/react-router/pull/10374))
819- Fix inadvertent re-renders when using `Component` instead of `element` on a route definition ([#10287](https://github.com/remix-run/react-router/pull/10287))
820- Fix detection of `useNavigate` in the render cycle by setting the `activeRef` in a layout effect, allowing the `navigate` function to be passed to child components and called in a `useEffect` there. ([#10394](https://github.com/remix-run/react-router/pull/10394))
821- Switched from `useSyncExternalStore` to `useState` for internal `@remix-run/router` router state syncing in `<RouterProvider>`. We found some [subtle bugs](https://codesandbox.io/s/use-sync-external-store-loop-9g7b81) where router state updates got propagated _before_ other normal `useState` updates, which could lead to footguns in `useEffect` calls. ([#10377](https://github.com/remix-run/react-router/pull/10377), [#10409](https://github.com/remix-run/react-router/pull/10409))
822- Allow `useRevalidator()` to resolve a loader-driven error boundary scenario ([#10369](https://github.com/remix-run/react-router/pull/10369))
823- Avoid unnecessary unsubscribe/resubscribes on router state changes ([#10409](https://github.com/remix-run/react-router/pull/10409))
824- When using a `RouterProvider`, `useNavigate`/`useSubmit`/`fetcher.submit` are now stable across location changes, since we can handle relative routing via the `@remix-run/router` instance and get rid of our dependence on `useLocation()`. When using `BrowserRouter`, these hooks remain unstable across location changes because they still rely on `useLocation()`. ([#10336](https://github.com/remix-run/react-router/pull/10336))
825- Updated dependencies:
826 - `@remix-run/router@1.6.0`
827
828## 6.10.0
829
830### Minor Changes
831
832- Added support for [**Future Flags**](https://reactrouter.com/v6/guides/api-development-strategy) in React Router. The first flag being introduced is `future.v7_normalizeFormMethod` which will normalize the exposed `useNavigation()/useFetcher()` `formMethod` fields as uppercase HTTP methods to align with the `fetch()` behavior. ([#10207](https://github.com/remix-run/react-router/pull/10207))
833
834 - When `future.v7_normalizeFormMethod === false` (default v6 behavior),
835 - `useNavigation().formMethod` is lowercase
836 - `useFetcher().formMethod` is lowercase
837 - When `future.v7_normalizeFormMethod === true`:
838 - `useNavigation().formMethod` is uppercase
839 - `useFetcher().formMethod` is uppercase
840
841### Patch Changes
842
843- Fix route ID generation when using Fragments in `createRoutesFromElements` ([#10193](https://github.com/remix-run/react-router/pull/10193))
844- Updated dependencies:
845 - `@remix-run/router@1.5.0`
846
847## 6.9.0
848
849### Minor Changes
850
851- React Router now supports an alternative way to define your route `element` and `errorElement` fields as React Components instead of React Elements. You can instead pass a React Component to the new `Component` and `ErrorBoundary` fields if you choose. There is no functional difference between the two, so use whichever approach you prefer 😀. You shouldn't be defining both, but if you do `Component`/`ErrorBoundary` will "win". ([#10045](https://github.com/remix-run/react-router/pull/10045))
852
853 **Example JSON Syntax**
854
855 ```jsx
856 // Both of these work the same:
857 const elementRoutes = [{
858 path: '/',
859 element: <Home />,
860 errorElement: <HomeError />,
861 }]
862
863 const componentRoutes = [{
864 path: '/',
865 Component: Home,
866 ErrorBoundary: HomeError,
867 }]
868
869 function Home() { ... }
870 function HomeError() { ... }
871 ```
872
873 **Example JSX Syntax**
874
875 ```jsx
876 // Both of these work the same:
877 const elementRoutes = createRoutesFromElements(
878 <Route path='/' element={<Home />} errorElement={<HomeError /> } />
879 );
880
881 const componentRoutes = createRoutesFromElements(
882 <Route path='/' Component={Home} ErrorBoundary={HomeError} />
883 );
884
885 function Home() { ... }
886 function HomeError() { ... }
887 ```
888
889- **Introducing Lazy Route Modules!** ([#10045](https://github.com/remix-run/react-router/pull/10045))
890
891 In order to keep your application bundles small and support code-splitting of your routes, we've introduced a new `lazy()` route property. This is an async function that resolves the non-route-matching portions of your route definition (`loader`, `action`, `element`/`Component`, `errorElement`/`ErrorBoundary`, `shouldRevalidate`, `handle`).
892
893 Lazy routes are resolved on initial load and during the `loading` or `submitting` phase of a navigation or fetcher call. You cannot lazily define route-matching properties (`path`, `index`, `children`) since we only execute your lazy route functions after we've matched known routes.
894
895 Your `lazy` functions will typically return the result of a dynamic import.
896
897 ```jsx
898 // In this example, we assume most folks land on the homepage so we include that
899 // in our critical-path bundle, but then we lazily load modules for /a and /b so
900 // they don't load until the user navigates to those routes
901 let routes = createRoutesFromElements(
902 <Route path="/" element={<Layout />}>
903 <Route index element={<Home />} />
904 <Route path="a" lazy={() => import("./a")} />
905 <Route path="b" lazy={() => import("./b")} />
906 </Route>
907 );
908 ```
909
910 Then in your lazy route modules, export the properties you want defined for the route:
911
912 ```jsx
913 export async function loader({ request }) {
914 let data = await fetchData(request);
915 return json(data);
916 }
917
918 // Export a `Component` directly instead of needing to create a React Element from it
919 export function Component() {
920 let data = useLoaderData();
921
922 return (
923 <>
924 <h1>You made it!</h1>
925 <p>{data}</p>
926 </>
927 );
928 }
929
930 // Export an `ErrorBoundary` directly instead of needing to create a React Element from it
931 export function ErrorBoundary() {
932 let error = useRouteError();
933 return isRouteErrorResponse(error) ? (
934 <h1>
935 {error.status} {error.statusText}
936 </h1>
937 ) : (
938 <h1>{error.message || error}</h1>
939 );
940 }
941 ```
942
943 An example of this in action can be found in the [`examples/lazy-loading-router-provider`](https://github.com/remix-run/react-router/tree/main/examples/lazy-loading-router-provider) directory of the repository.
944
945 🙌 Huge thanks to @rossipedia for the [Initial Proposal](https://github.com/remix-run/react-router/discussions/9826) and [POC Implementation](https://github.com/remix-run/react-router/pull/9830).
946
947- Updated dependencies:
948 - `@remix-run/router@1.4.0`
949
950### Patch Changes
951
952- Fix `generatePath` incorrectly applying parameters in some cases ([#10078](https://github.com/remix-run/react-router/pull/10078))
953- Improve memoization for context providers to avoid unnecessary re-renders ([#9983](https://github.com/remix-run/react-router/pull/9983))
954
955## 6.8.2
956
957### Patch Changes
958
959- Updated dependencies:
960 - `@remix-run/router@1.3.3`
961
962## 6.8.1
963
964### Patch Changes
965
966- Remove inaccurate console warning for POP navigations and update active blocker logic ([#10030](https://github.com/remix-run/react-router/pull/10030))
967- Updated dependencies:
968 - `@remix-run/router@1.3.2`
969
970## 6.8.0
971
972### Patch Changes
973
974- Updated dependencies:
975 - `@remix-run/router@1.3.1`
976
977## 6.7.0
978
979### Minor Changes
980
981- Add `unstable_useBlocker` hook for blocking navigations within the app's location origin ([#9709](https://github.com/remix-run/react-router/pull/9709))
982
983### Patch Changes
984
985- Fix `generatePath` when optional params are present ([#9764](https://github.com/remix-run/react-router/pull/9764))
986- Update `<Await>` to accept `ReactNode` as children function return result ([#9896](https://github.com/remix-run/react-router/pull/9896))
987- Updated dependencies:
988 - `@remix-run/router@1.3.0`
989
990## 6.6.2
991
992### Patch Changes
993
994- Ensure `useId` consistency during SSR ([#9805](https://github.com/remix-run/react-router/pull/9805))
995
996## 6.6.1
997
998### Patch Changes
999
1000- Updated dependencies:
1001 - `@remix-run/router@1.2.1`
1002
1003## 6.6.0
1004
1005### Patch Changes
1006
1007- Prevent `useLoaderData` usage in `errorElement` ([#9735](https://github.com/remix-run/react-router/pull/9735))
1008- Updated dependencies:
1009 - `@remix-run/router@1.2.0`
1010
1011## 6.5.0
1012
1013This release introduces support for [Optional Route Segments](https://github.com/remix-run/react-router/issues/9546). Now, adding a `?` to the end of any path segment will make that entire segment optional. This works for both static segments and dynamic parameters.
1014
1015**Optional Params Examples**
1016
1017- `<Route path=":lang?/about>` will match:
1018 - `/:lang/about`
1019 - `/about`
1020- `<Route path="/multistep/:widget1?/widget2?/widget3?">` will match:
1021 - `/multistep`
1022 - `/multistep/:widget1`
1023 - `/multistep/:widget1/:widget2`
1024 - `/multistep/:widget1/:widget2/:widget3`
1025
1026**Optional Static Segment Example**
1027
1028- `<Route path="/home?">` will match:
1029 - `/`
1030 - `/home`
1031- `<Route path="/fr?/about">` will match:
1032 - `/about`
1033 - `/fr/about`
1034
1035### Minor Changes
1036
1037- Allows optional routes and optional static segments ([#9650](https://github.com/remix-run/react-router/pull/9650))
1038
1039### Patch Changes
1040
1041- Stop incorrectly matching on partial named parameters, i.e. `<Route path="prefix-:param">`, to align with how splat parameters work. If you were previously relying on this behavior then it's recommended to extract the static portion of the path at the `useParams` call site: ([#9506](https://github.com/remix-run/react-router/pull/9506))
1042
1043```jsx
1044// Old behavior at URL /prefix-123
1045<Route path="prefix-:id" element={<Comp /> }>
1046
1047function Comp() {
1048 let params = useParams(); // { id: '123' }
1049 let id = params.id; // "123"
1050 ...
1051}
1052
1053// New behavior at URL /prefix-123
1054<Route path=":id" element={<Comp /> }>
1055
1056function Comp() {
1057 let params = useParams(); // { id: 'prefix-123' }
1058 let id = params.id.replace(/^prefix-/, ''); // "123"
1059 ...
1060}
1061```
1062
1063- Updated dependencies:
1064 - `@remix-run/router@1.1.0`
1065
1066## 6.4.5
1067
1068### Patch Changes
1069
1070- Updated dependencies:
1071 - `@remix-run/router@1.0.5`
1072
1073## 6.4.4
1074
1075### Patch Changes
1076
1077- Updated dependencies:
1078 - `@remix-run/router@1.0.4`
1079
1080## 6.4.3
1081
1082### Patch Changes
1083
1084- `useRoutes` should be able to return `null` when passing `locationArg` ([#9485](https://github.com/remix-run/react-router/pull/9485))
1085- fix `initialEntries` type in `createMemoryRouter` ([#9498](https://github.com/remix-run/react-router/pull/9498))
1086- Updated dependencies:
1087 - `@remix-run/router@1.0.3`
1088
1089## 6.4.2
1090
1091### Patch Changes
1092
1093- Fix `IndexRouteObject` and `NonIndexRouteObject` types to make `hasErrorElement` optional ([#9394](https://github.com/remix-run/react-router/pull/9394))
1094- Enhance console error messages for invalid usage of data router hooks ([#9311](https://github.com/remix-run/react-router/pull/9311))
1095- If an index route has children, it will result in a runtime error. We have strengthened our `RouteObject`/`RouteProps` types to surface the error in TypeScript. ([#9366](https://github.com/remix-run/react-router/pull/9366))
1096- Updated dependencies:
1097 - `@remix-run/router@1.0.2`
1098
1099## 6.4.1
1100
1101### Patch Changes
1102
1103- Preserve state from `initialEntries` ([#9288](https://github.com/remix-run/react-router/pull/9288))
1104- Updated dependencies:
1105 - `@remix-run/router@1.0.1`
1106
1107## 6.4.0
1108
1109Whoa this is a big one! `6.4.0` brings all the data loading and mutation APIs over from Remix. Here's a quick high level overview, but it's recommended you go check out the [docs](https://reactrouter.com), especially the [feature overview](https://reactrouter.com/en/6.4.0/start/overview) and the [tutorial](https://reactrouter.com/en/6.4.0/start/tutorial).
1110
1111**New APIs**
1112
1113- Create your router with `createMemoryRouter`
1114- Render your router with `<RouterProvider>`
1115- Load data with a Route `loader` and mutate with a Route `action`
1116- Handle errors with Route `errorElement`
1117- Defer non-critical data with `defer` and `Await`
1118
1119**Bug Fixes**
1120
1121- Path resolution is now trailing slash agnostic (#8861)
1122- `useLocation` returns the scoped location inside a `<Routes location>` component (#9094)
1123
1124**Updated Dependencies**
1125
1126- `@remix-run/router@1.0.0`