UNPKG

30.1 kB Markdown View 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:
18 - `unstable_patchRoutesOnMiss` docs:
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
112 <Routes>
113 <Route path="/" element={<Home />} />
114 <Route path="dashboard/*" element={<Dashboard />} />
115 </Routes>
116
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
165 <Routes>
166 <Route path="dashboard">
167 <Route path="*" element={<Dashboard />} />
168 </Route>
169 </Routes>
170
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
202 <Routes>
203 <Route path="dashboard">
204 <Route index path="*" element={<Dashboard />} />
205 </Route>
206 </Routes>
207
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 ). 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
360 <Routes>{/*...*/}</Routes>
361
362
363
364 ```
365
366 If you wish to enable `React.startTransition`, pass the future flag to your component:
367
368 ```jsx
369
370 <Routes>{/*...*/}</Routes>
371
372
373
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
618 This 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 }>
651
652 function Comp() {
653 let params = useParams(); // { id: '123' }
654 let id = params.id; // "123"
655 ...
656 }
657
658 // New behavior at URL /prefix-123
659 }>
660
661 function 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
714 Whoa 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`