UNPKG

30.1 kBMarkdownView Raw
1# `react-router`
2
3## 6.24.1
4
5### Patch Changes
6
7- 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))
8- Updated dependencies:
9 - `@remix-run/router@1.17.1`
10
11## 6.24.0
12
13### Minor Changes
14
15- Add support for Lazy Route Discovery (a.k.a. Fog of War) ([#11626](https://github.com/remix-run/react-router/pull/11626))
16
17 - RFC: <https://github.com/remix-run/react-router/discussions/11113>
18 - `unstable_patchRoutesOnMiss` docs: <https://reactrouter.com/en/main/routers/create-browser-router>
19
20### Patch Changes
21
22- Updated dependencies:
23 - `@remix-run/router@1.17.0`
24
25## 6.23.1
26
27### Patch Changes
28
29- allow undefined to be resolved with `<Await>` ([#11513](https://github.com/remix-run/react-router/pull/11513))
30- Updated dependencies:
31 - `@remix-run/router@1.16.1`
32
33## 6.23.0
34
35### Minor Changes
36
37- Add a new `unstable_dataStrategy` configuration option ([#11098](https://github.com/remix-run/react-router/pull/11098))
38 - This option allows Data Router applications to take control over the approach for executing route loaders and actions
39 - 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
40
41### Patch Changes
42
43- Updated dependencies:
44 - `@remix-run/router@1.16.0`
45
46## 6.22.3
47
48### Patch Changes
49
50- Updated dependencies:
51 - `@remix-run/router@1.15.3`
52
53## 6.22.2
54
55### Patch Changes
56
57- Updated dependencies:
58 - `@remix-run/router@1.15.2`
59
60## 6.22.1
61
62### Patch Changes
63
64- Fix encoding/decoding issues with pre-encoded dynamic parameter values ([#11199](https://github.com/remix-run/react-router/pull/11199))
65- Updated dependencies:
66 - `@remix-run/router@1.15.1`
67
68## 6.22.0
69
70### Patch Changes
71
72- Updated dependencies:
73 - `@remix-run/router@1.15.0`
74
75## 6.21.3
76
77### Patch Changes
78
79- Remove leftover `unstable_` prefix from `Blocker`/`BlockerFunction` types ([#11187](https://github.com/remix-run/react-router/pull/11187))
80
81## 6.21.2
82
83### Patch Changes
84
85- Updated dependencies:
86 - `@remix-run/router@1.14.2`
87
88## 6.21.1
89
90### Patch Changes
91
92- 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))
93- Updated dependencies:
94 - `@remix-run/router@1.14.1`
95
96## 6.21.0
97
98### Minor Changes
99
100- 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))
101
102 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))
103
104 **The Bug**
105 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.
106
107 **The Background**
108 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:
109
110 ```jsx
111 <BrowserRouter>
112 <Routes>
113 <Route path="/" element={<Home />} />
114 <Route path="dashboard/*" element={<Dashboard />} />
115 </Routes>
116 </BrowserRouter>
117 ```
118
119 Any paths like `/dashboard`, `/dashboard/team`, `/dashboard/projects` will match the `Dashboard` route. The dashboard component itself can then render nested `<Routes>`:
120
121 ```jsx
122 function Dashboard() {
123 return (
124 <div>
125 <h2>Dashboard</h2>
126 <nav>
127 <Link to="/">Dashboard Home</Link>
128 <Link to="team">Team</Link>
129 <Link to="projects">Projects</Link>
130 </nav>
131
132 <Routes>
133 <Route path="/" element={<DashboardHome />} />
134 <Route path="team" element={<DashboardTeam />} />
135 <Route path="projects" element={<DashboardProjects />} />
136 </Routes>
137 </div>
138 );
139 }
140 ```
141
142 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.
143
144 **The Problem**
145
146 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 `"."`:
147
148 ```jsx
149 // If we are on URL /dashboard/team, and we want to link to /dashboard/team:
150 function DashboardTeam() {
151 // ❌ This is broken and results in <a href="/dashboard">
152 return <Link to=".">A broken link to the Current URL</Link>;
153
154 // ✅ This is fixed but super unintuitive since we're already at /dashboard/team!
155 return <Link to="./team">A broken link to the Current URL</Link>;
156 }
157 ```
158
159 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.
160
161 Even worse, consider a nested splat route configuration:
162
163 ```jsx
164 <BrowserRouter>
165 <Routes>
166 <Route path="dashboard">
167 <Route path="*" element={<Dashboard />} />
168 </Route>
169 </Routes>
170 </BrowserRouter>
171 ```
172
173 Now, a `<Link to=".">` and a `<Link to="..">` inside the `Dashboard` component go to the same place! That is definitely not correct!
174
175 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:
176
177 ```jsx
178 let router = createBrowserRouter({
179 path: "/dashboard",
180 children: [
181 {
182 path: "*",
183 action: dashboardAction,
184 Component() {
185 // ❌ This form is broken! It throws a 405 error when it submits because
186 // it tries to submit to /dashboard (without the splat value) and the parent
187 // `/dashboard` route doesn't have an action
188 return <Form method="post">...</Form>;
189 },
190 },
191 ],
192 });
193 ```
194
195 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.
196
197 **The Solution**
198 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:
199
200 ```jsx
201 <BrowserRouter>
202 <Routes>
203 <Route path="dashboard">
204 <Route index path="*" element={<Dashboard />} />
205 </Route>
206 </Routes>
207 </BrowserRouter>
208
209 function Dashboard() {
210 return (
211 <div>
212 <h2>Dashboard</h2>
213 <nav>
214 <Link to="..">Dashboard Home</Link>
215 <Link to="../team">Team</Link>
216 <Link to="../projects">Projects</Link>
217 </nav>
218
219 <Routes>
220 <Route path="/" element={<DashboardHome />} />
221 <Route path="team" element={<DashboardTeam />} />
222 <Route path="projects" element={<DashboardProjects />} />
223 </Router>
224 </div>
225 );
226 }
227 ```
228
229 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".
230
231### Patch Changes
232
233- Properly handle falsy error values in ErrorBoundary's ([#11071](https://github.com/remix-run/react-router/pull/11071))
234- Updated dependencies:
235 - `@remix-run/router@1.14.0`
236
237## 6.20.1
238
239### Patch Changes
240
241- 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))
242- Updated dependencies:
243 - `@remix-run/router@1.13.1`
244
245## 6.20.0
246
247### Minor Changes
248
249- Export the `PathParam` type from the public API ([#10719](https://github.com/remix-run/react-router/pull/10719))
250
251### Patch Changes
252
253- Fix bug with `resolveTo` in splat routes ([#11045](https://github.com/remix-run/react-router/pull/11045))
254 - 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`
255 - This removes the `UNSAFE_getPathContributingMatches` export from `@remix-run/router` since we no longer need this in the `react-router`/`react-router-dom` layers
256- Updated dependencies:
257 - `@remix-run/router@1.13.0`
258
259## 6.19.0
260
261### Minor Changes
262
263- 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))
264- Remove the `unstable_` prefix from the [`useBlocker`](https://reactrouter.com/en/main/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))
265
266### Patch Changes
267
268- 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))
269
270- 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))
271
272 - ⚠️ 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.
273
274- Updated dependencies:
275 - `@remix-run/router@1.12.0`
276
277## 6.18.0
278
279### Patch Changes
280
281- 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))
282- Updated dependencies:
283 - `@remix-run/router@1.11.0`
284
285## 6.17.0
286
287### Patch Changes
288
289- 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))
290- Updated dependencies:
291 - `@remix-run/router@1.10.0`
292
293## 6.16.0
294
295### Minor Changes
296
297- 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))
298 - `Location` now accepts a generic for the `location.state` value
299 - `ActionFunctionArgs`/`ActionFunction`/`LoaderFunctionArgs`/`LoaderFunction` now accept a generic for the `context` parameter (only used in SSR usages via `createStaticHandler`)
300 - 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`
301- 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))
302- Export `ShouldRevalidateFunctionArgs` interface ([#10797](https://github.com/remix-run/react-router/pull/10797))
303- 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))
304
305### Patch Changes
306
307- Updated dependencies:
308 - `@remix-run/router@1.9.0`
309
310## 6.15.0
311
312### Minor Changes
313
314- 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))
315
316### Patch Changes
317
318- Ensure `useRevalidator` is referentially stable across re-renders if revalidations are not actively occurring ([#10707](https://github.com/remix-run/react-router/pull/10707))
319- Updated dependencies:
320 - `@remix-run/router@1.8.0`
321
322## 6.14.2
323
324### Patch Changes
325
326- Updated dependencies:
327 - `@remix-run/router@1.7.2`
328
329## 6.14.1
330
331### Patch Changes
332
333- Fix loop in `unstable_useBlocker` when used with an unstable blocker function ([#10652](https://github.com/remix-run/react-router/pull/10652))
334- Fix issues with reused blockers on subsequent navigations ([#10656](https://github.com/remix-run/react-router/pull/10656))
335- Updated dependencies:
336 - `@remix-run/router@1.7.1`
337
338## 6.14.0
339
340### Patch Changes
341
342- Strip `basename` from locations provided to `unstable_useBlocker` functions to match `useLocation` ([#10573](https://github.com/remix-run/react-router/pull/10573))
343- Fix `generatePath` when passed a numeric `0` value parameter ([#10612](https://github.com/remix-run/react-router/pull/10612))
344- Fix `unstable_useBlocker` key issues in `StrictMode` ([#10573](https://github.com/remix-run/react-router/pull/10573))
345- Fix `tsc --skipLibCheck:false` issues on React 17 ([#10622](https://github.com/remix-run/react-router/pull/10622))
346- Upgrade `typescript` to 5.1 ([#10581](https://github.com/remix-run/react-router/pull/10581))
347- Updated dependencies:
348 - `@remix-run/router@1.7.0`
349
350## 6.13.0
351
352### Minor Changes
353
354- Move [`React.startTransition`](https://react.dev/reference/react/startTransition) usage behind a [future flag](https://reactrouter.com/en/main/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))
355
356 Existing behavior will no longer include `React.startTransition`:
357
358 ```jsx
359 <BrowserRouter>
360 <Routes>{/*...*/}</Routes>
361 </BrowserRouter>
362
363 <RouterProvider router={router} />
364 ```
365
366 If you wish to enable `React.startTransition`, pass the future flag to your component:
367
368 ```jsx
369 <BrowserRouter future={{ v7_startTransition: true }}>
370 <Routes>{/*...*/}</Routes>
371 </BrowserRouter>
372
373 <RouterProvider router={router} future={{ v7_startTransition: true }}/>
374 ```
375
376### Patch Changes
377
378- Work around webpack/terser `React.startTransition` minification bug in production mode ([#10588](https://github.com/remix-run/react-router/pull/10588))
379
380## 6.12.1
381
382> \[!WARNING]
383> 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.
384
385### Patch Changes
386
387- Adjust feature detection of `React.startTransition` to fix webpack + react 17 compilation error ([#10569](https://github.com/remix-run/react-router/pull/10569))
388
389## 6.12.0
390
391### Minor Changes
392
393- Wrap internal router state updates with `React.startTransition` if it exists ([#10438](https://github.com/remix-run/react-router/pull/10438))
394
395### Patch Changes
396
397- Updated dependencies:
398 - `@remix-run/router@1.6.3`
399
400## 6.11.2
401
402### Patch Changes
403
404- Fix `basename` duplication in descendant `<Routes>` inside a `<RouterProvider>` ([#10492](https://github.com/remix-run/react-router/pull/10492))
405- Updated dependencies:
406 - `@remix-run/router@1.6.2`
407
408## 6.11.1
409
410### Patch Changes
411
412- Fix usage of `Component` API within descendant `<Routes>` ([#10434](https://github.com/remix-run/react-router/pull/10434))
413- Fix bug when calling `useNavigate` from `<Routes>` inside a `<RouterProvider>` ([#10432](https://github.com/remix-run/react-router/pull/10432))
414- Fix usage of `<Navigate>` in strict mode when using a data router ([#10435](https://github.com/remix-run/react-router/pull/10435))
415- Updated dependencies:
416 - `@remix-run/router@1.6.1`
417
418## 6.11.0
419
420### Patch Changes
421
422- Log loader/action errors to the console in dev for easier stack trace evaluation ([#10286](https://github.com/remix-run/react-router/pull/10286))
423- Fix bug preventing rendering of descendant `<Routes>` when `RouterProvider` errors existed ([#10374](https://github.com/remix-run/react-router/pull/10374))
424- Fix inadvertent re-renders when using `Component` instead of `element` on a route definition ([#10287](https://github.com/remix-run/react-router/pull/10287))
425- 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))
426- 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))
427- Allow `useRevalidator()` to resolve a loader-driven error boundary scenario ([#10369](https://github.com/remix-run/react-router/pull/10369))
428- Avoid unnecessary unsubscribe/resubscribes on router state changes ([#10409](https://github.com/remix-run/react-router/pull/10409))
429- 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))
430- Updated dependencies:
431 - `@remix-run/router@1.6.0`
432
433## 6.10.0
434
435### Minor Changes
436
437- Added support for [**Future Flags**](https://reactrouter.com/en/main/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))
438
439 - When `future.v7_normalizeFormMethod === false` (default v6 behavior),
440 - `useNavigation().formMethod` is lowercase
441 - `useFetcher().formMethod` is lowercase
442 - When `future.v7_normalizeFormMethod === true`:
443 - `useNavigation().formMethod` is uppercase
444 - `useFetcher().formMethod` is uppercase
445
446### Patch Changes
447
448- Fix route ID generation when using Fragments in `createRoutesFromElements` ([#10193](https://github.com/remix-run/react-router/pull/10193))
449- Updated dependencies:
450 - `@remix-run/router@1.5.0`
451
452## 6.9.0
453
454### Minor Changes
455
456- 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))
457
458 **Example JSON Syntax**
459
460 ```jsx
461 // Both of these work the same:
462 const elementRoutes = [{
463 path: '/',
464 element: <Home />,
465 errorElement: <HomeError />,
466 }]
467
468 const componentRoutes = [{
469 path: '/',
470 Component: Home,
471 ErrorBoundary: HomeError,
472 }]
473
474 function Home() { ... }
475 function HomeError() { ... }
476 ```
477
478 **Example JSX Syntax**
479
480 ```jsx
481 // Both of these work the same:
482 const elementRoutes = createRoutesFromElements(
483 <Route path='/' element={<Home />} errorElement={<HomeError /> } />
484 );
485
486 const componentRoutes = createRoutesFromElements(
487 <Route path='/' Component={Home} ErrorBoundary={HomeError} />
488 );
489
490 function Home() { ... }
491 function HomeError() { ... }
492 ```
493
494- **Introducing Lazy Route Modules!** ([#10045](https://github.com/remix-run/react-router/pull/10045))
495
496 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`).
497
498 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.
499
500 Your `lazy` functions will typically return the result of a dynamic import.
501
502 ```jsx
503 // In this example, we assume most folks land on the homepage so we include that
504 // in our critical-path bundle, but then we lazily load modules for /a and /b so
505 // they don't load until the user navigates to those routes
506 let routes = createRoutesFromElements(
507 <Route path="/" element={<Layout />}>
508 <Route index element={<Home />} />
509 <Route path="a" lazy={() => import("./a")} />
510 <Route path="b" lazy={() => import("./b")} />
511 </Route>
512 );
513 ```
514
515 Then in your lazy route modules, export the properties you want defined for the route:
516
517 ```jsx
518 export async function loader({ request }) {
519 let data = await fetchData(request);
520 return json(data);
521 }
522
523 // Export a `Component` directly instead of needing to create a React Element from it
524 export function Component() {
525 let data = useLoaderData();
526
527 return (
528 <>
529 <h1>You made it!</h1>
530 <p>{data}</p>
531 </>
532 );
533 }
534
535 // Export an `ErrorBoundary` directly instead of needing to create a React Element from it
536 export function ErrorBoundary() {
537 let error = useRouteError();
538 return isRouteErrorResponse(error) ? (
539 <h1>
540 {error.status} {error.statusText}
541 </h1>
542 ) : (
543 <h1>{error.message || error}</h1>
544 );
545 }
546 ```
547
548 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.
549
550 🙌 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).
551
552- Updated dependencies:
553 - `@remix-run/router@1.4.0`
554
555### Patch Changes
556
557- Fix `generatePath` incorrectly applying parameters in some cases ([#10078](https://github.com/remix-run/react-router/pull/10078))
558- Improve memoization for context providers to avoid unnecessary re-renders ([#9983](https://github.com/remix-run/react-router/pull/9983))
559
560## 6.8.2
561
562### Patch Changes
563
564- Updated dependencies:
565 - `@remix-run/router@1.3.3`
566
567## 6.8.1
568
569### Patch Changes
570
571- Remove inaccurate console warning for POP navigations and update active blocker logic ([#10030](https://github.com/remix-run/react-router/pull/10030))
572- Updated dependencies:
573 - `@remix-run/router@1.3.2`
574
575## 6.8.0
576
577### Patch Changes
578
579- Updated dependencies:
580 - `@remix-run/router@1.3.1`
581
582## 6.7.0
583
584### Minor Changes
585
586- Add `unstable_useBlocker` hook for blocking navigations within the app's location origin ([#9709](https://github.com/remix-run/react-router/pull/9709))
587
588### Patch Changes
589
590- Fix `generatePath` when optional params are present ([#9764](https://github.com/remix-run/react-router/pull/9764))
591- Update `<Await>` to accept `ReactNode` as children function return result ([#9896](https://github.com/remix-run/react-router/pull/9896))
592- Updated dependencies:
593 - `@remix-run/router@1.3.0`
594
595## 6.6.2
596
597### Patch Changes
598
599- Ensure `useId` consistency during SSR ([#9805](https://github.com/remix-run/react-router/pull/9805))
600
601## 6.6.1
602
603### Patch Changes
604
605- Updated dependencies:
606 - `@remix-run/router@1.2.1`
607
608## 6.6.0
609
610### Patch Changes
611
612- Prevent `useLoaderData` usage in `errorElement` ([#9735](https://github.com/remix-run/react-router/pull/9735))
613- Updated dependencies:
614 - `@remix-run/router@1.2.0`
615
616## 6.5.0
617
618This 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.
619
620**Optional Params Examples**
621
622- `<Route path=":lang?/about>` will match:
623 - `/:lang/about`
624 - `/about`
625- `<Route path="/multistep/:widget1?/widget2?/widget3?">` will match:
626 - `/multistep`
627 - `/multistep/:widget1`
628 - `/multistep/:widget1/:widget2`
629 - `/multistep/:widget1/:widget2/:widget3`
630
631**Optional Static Segment Example**
632
633- `<Route path="/home?">` will match:
634 - `/`
635 - `/home`
636- `<Route path="/fr?/about">` will match:
637 - `/about`
638 - `/fr/about`
639
640### Minor Changes
641
642- Allows optional routes and optional static segments ([#9650](https://github.com/remix-run/react-router/pull/9650))
643
644### Patch Changes
645
646- 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))
647
648```jsx
649// Old behavior at URL /prefix-123
650<Route path="prefix-:id" element={<Comp /> }>
651
652function Comp() {
653 let params = useParams(); // { id: '123' }
654 let id = params.id; // "123"
655 ...
656}
657
658// New behavior at URL /prefix-123
659<Route path=":id" element={<Comp /> }>
660
661function Comp() {
662 let params = useParams(); // { id: 'prefix-123' }
663 let id = params.id.replace(/^prefix-/, ''); // "123"
664 ...
665}
666```
667
668- Updated dependencies:
669 - `@remix-run/router@1.1.0`
670
671## 6.4.5
672
673### Patch Changes
674
675- Updated dependencies:
676 - `@remix-run/router@1.0.5`
677
678## 6.4.4
679
680### Patch Changes
681
682- Updated dependencies:
683 - `@remix-run/router@1.0.4`
684
685## 6.4.3
686
687### Patch Changes
688
689- `useRoutes` should be able to return `null` when passing `locationArg` ([#9485](https://github.com/remix-run/react-router/pull/9485))
690- fix `initialEntries` type in `createMemoryRouter` ([#9498](https://github.com/remix-run/react-router/pull/9498))
691- Updated dependencies:
692 - `@remix-run/router@1.0.3`
693
694## 6.4.2
695
696### Patch Changes
697
698- Fix `IndexRouteObject` and `NonIndexRouteObject` types to make `hasErrorElement` optional ([#9394](https://github.com/remix-run/react-router/pull/9394))
699- Enhance console error messages for invalid usage of data router hooks ([#9311](https://github.com/remix-run/react-router/pull/9311))
700- 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))
701- Updated dependencies:
702 - `@remix-run/router@1.0.2`
703
704## 6.4.1
705
706### Patch Changes
707
708- Preserve state from `initialEntries` ([#9288](https://github.com/remix-run/react-router/pull/9288))
709- Updated dependencies:
710 - `@remix-run/router@1.0.1`
711
712## 6.4.0
713
714Whoa 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/start/overview) and the [tutorial](https://reactrouter.com/start/tutorial).
715
716**New APIs**
717
718- Create your router with `createMemoryRouter`
719- Render your router with `<RouterProvider>`
720- Load data with a Route `loader` and mutate with a Route `action`
721- Handle errors with Route `errorElement`
722- Defer non-critical data with `defer` and `Await`
723
724**Bug Fixes**
725
726- Path resolution is now trailing slash agnostic (#8861)
727- `useLocation` returns the scoped location inside a `<Routes location>` component (#9094)
728
729**Updated Dependencies**
730
731- `@remix-run/router@1.0.0`