Skip to content

Commit a04ab75

Browse files
authored
fix: rename resetScroll -> preventScrollReset (#9199)
* fix: rename resetScroll -> preventScrollReset * Add changeset
1 parent 28826a9 commit a04ab75

File tree

14 files changed

+122
-64
lines changed

14 files changed

+122
-64
lines changed

.changeset/red-sheep-push.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"react-router": patch
3+
"react-router-dom": patch
4+
"@remix-run/router": patch
5+
---
6+
7+
fix: rename resetScroll -> preventScrollReset (#9199)

docs/components/link.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,12 @@ A relative `<Link to>` value (that does not begin with `/`) resolves relative to
5656

5757
[link-native]: ./link-native
5858

59-
## `resetScroll`
59+
## `preventScrollReset`
6060

6161
If you are using [`<ScrollRestoration>`][scrollrestoration], this lets you prevent the scroll position from being reset to the top of the window when the link is clicked.
6262

6363
```tsx
64-
<Link to="?tab=one" resetScroll={false} />
64+
<Link to="?tab=one" preventScrollReset={true} />
6565
```
6666

6767
This does not prevent the scroll position from being restored when the user comes back to the location with the back/forward buttons, it just prevents the reset when the user clicks the link.

docs/components/scroll-restoration.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ Or you may want to only use the pathname for some paths, and use the normal beha
9696
When navigation creates new scroll keys, the scroll position is reset to the top of the page. You can prevent the "scroll to top" behavior from your links:
9797

9898
```tsx
99-
<Link resetScroll={false} />
99+
<Link preventScrollReset={true} />
100100
```
101101

102-
See also: [`<Link resetScroll>`][resetscroll]
102+
See also: [`<Link preventScrollReset>`][preventscrollreset]
103103

104104
## Scroll Flashing
105105

@@ -108,4 +108,4 @@ Without a server side rendering framework like [Remix][remix], you may experienc
108108
Server Rendering frameworks can prevent scroll flashing because they can send a fully formed document on the initial load, so scroll can be restored when the page first renders.
109109

110110
[remix]: https://remix.run
111-
[resetscroll]: ../components/link#resetscroll
111+
[preventscrollreset]: ../components/link#preventscrollreset

docs/hooks/use-search-params-rn.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type SetURLSearchParams = (
3232
interface NavigateOptions {
3333
replace?: boolean;
3434
state?: any;
35-
resetScroll?: boolean;
35+
preventScrollReset?: boolean;
3636
}
3737
```
3838

docs/hooks/use-search-params.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type SetURLSearchParams = (
3232
interface NavigateOptions {
3333
replace?: boolean;
3434
state?: any;
35-
resetScroll?: boolean;
35+
preventScrollReset?: boolean;
3636
}
3737
```
3838

examples/scroll-restoration/src/routes.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ export function Layout() {
9494
</Link>
9595
</li>
9696
<li className="navitem">
97-
<Link to="/restore-by-key" resetScroll={false}>
97+
<Link to="/restore-by-key" preventScrollReset>
9898
This link will not scroll to the top
9999
</Link>
100100
</li>

packages/react-router-dom/__tests__/data-browser-router-test.tsx

+55-8
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ function testDomRouter(
537537
`);
538538
});
539539

540-
it("handles link navigations with resetScroll=false", async () => {
540+
it("handles link navigations with preventScrollReset", async () => {
541541
let { container } = render(
542542
<TestDataRouter window={getWindow("/foo")} hydrationData={{}}>
543543
<Route path="/" element={<Layout />}>
@@ -551,37 +551,84 @@ function testDomRouter(
551551
let state = React.useContext(DataRouterStateContext);
552552
return (
553553
<div>
554-
<Link to="/foo" resetScroll={false}>
554+
<Link to="/foo" preventScrollReset>
555555
Link to Foo
556556
</Link>
557557
<Link to="/bar">Link to Bar</Link>
558-
<p id="resetScrollPosition">{String(state.resetScrollPosition)}</p>
558+
<p id="preventScrollReset">{String(state?.preventScrollReset)}</p>
559559
<Outlet />
560560
</div>
561561
);
562562
}
563563

564564
fireEvent.click(screen.getByText("Link to Bar"));
565565
await waitFor(() => screen.getByText("Bar Heading"));
566-
expect(getHtml(container.querySelector("#resetScrollPosition")))
566+
expect(getHtml(container.querySelector("#preventScrollReset")))
567567
.toMatchInlineSnapshot(`
568568
"<p
569-
id=\\"resetScrollPosition\\"
569+
id=\\"preventScrollReset\\"
570570
>
571-
true
571+
false
572572
</p>"
573573
`);
574574

575575
fireEvent.click(screen.getByText("Link to Foo"));
576576
await waitFor(() => screen.getByText("Foo Heading"));
577-
expect(getHtml(container.querySelector("#resetScrollPosition")))
577+
expect(getHtml(container.querySelector("#preventScrollReset")))
578+
.toMatchInlineSnapshot(`
579+
"<p
580+
id=\\"preventScrollReset\\"
581+
>
582+
true
583+
</p>"
584+
`);
585+
});
586+
587+
it("handles link navigations with preventScrollReset={true}", async () => {
588+
let { container } = render(
589+
<TestDataRouter window={getWindow("/foo")} hydrationData={{}}>
590+
<Route path="/" element={<Layout />}>
591+
<Route path="foo" element={<h1>Foo Heading</h1>} />
592+
<Route path="bar" element={<h1>Bar Heading</h1>} />
593+
</Route>
594+
</TestDataRouter>
595+
);
596+
597+
function Layout() {
598+
let state = React.useContext(DataRouterStateContext);
599+
return (
600+
<div>
601+
<Link to="/foo" preventScrollReset={true}>
602+
Link to Foo
603+
</Link>
604+
<Link to="/bar">Link to Bar</Link>
605+
<p id="preventScrollReset">{String(state?.preventScrollReset)}</p>
606+
<Outlet />
607+
</div>
608+
);
609+
}
610+
611+
fireEvent.click(screen.getByText("Link to Bar"));
612+
await waitFor(() => screen.getByText("Bar Heading"));
613+
expect(getHtml(container.querySelector("#preventScrollReset")))
578614
.toMatchInlineSnapshot(`
579615
"<p
580-
id=\\"resetScrollPosition\\"
616+
id=\\"preventScrollReset\\"
581617
>
582618
false
583619
</p>"
584620
`);
621+
622+
fireEvent.click(screen.getByText("Link to Foo"));
623+
await waitFor(() => screen.getByText("Foo Heading"));
624+
expect(getHtml(container.querySelector("#preventScrollReset")))
625+
.toMatchInlineSnapshot(`
626+
"<p
627+
id=\\"preventScrollReset\\"
628+
>
629+
true
630+
</p>"
631+
`);
585632
});
586633

587634
it("executes route actions/loaders on useSubmit navigations", async () => {

packages/react-router-dom/index.tsx

+10-10
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ export interface LinkProps
395395
reloadDocument?: boolean;
396396
replace?: boolean;
397397
state?: any;
398-
resetScroll?: boolean;
398+
preventScrollReset?: boolean;
399399
relative?: RelativeRoutingType;
400400
to: To;
401401
}
@@ -413,7 +413,7 @@ export const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(
413413
state,
414414
target,
415415
to,
416-
resetScroll,
416+
preventScrollReset,
417417
...rest
418418
},
419419
ref
@@ -423,7 +423,7 @@ export const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(
423423
replace,
424424
state,
425425
target,
426-
resetScroll,
426+
preventScrollReset,
427427
relative,
428428
});
429429
function handleClick(
@@ -706,13 +706,13 @@ export function useLinkClickHandler<E extends Element = HTMLAnchorElement>(
706706
target,
707707
replace: replaceProp,
708708
state,
709-
resetScroll,
709+
preventScrollReset,
710710
relative,
711711
}: {
712712
target?: React.HTMLAttributeAnchorTarget;
713713
replace?: boolean;
714714
state?: any;
715-
resetScroll?: boolean;
715+
preventScrollReset?: boolean;
716716
relative?: RelativeRoutingType;
717717
} = {}
718718
): (event: React.MouseEvent<E, MouseEvent>) => void {
@@ -732,7 +732,7 @@ export function useLinkClickHandler<E extends Element = HTMLAnchorElement>(
732732
? replaceProp
733733
: createPath(location) === createPath(path);
734734

735-
navigate(to, { replace, state, resetScroll, relative });
735+
navigate(to, { replace, state, preventScrollReset, relative });
736736
}
737737
},
738738
[
@@ -743,7 +743,7 @@ export function useLinkClickHandler<E extends Element = HTMLAnchorElement>(
743743
state,
744744
target,
745745
to,
746-
resetScroll,
746+
preventScrollReset,
747747
relative,
748748
]
749749
);
@@ -1053,7 +1053,7 @@ function useScrollRestoration({
10531053
router != null && state != null,
10541054
"useScrollRestoration must be used within a DataRouterStateContext"
10551055
);
1056-
let { restoreScrollPosition, resetScrollPosition } = state;
1056+
let { restoreScrollPosition, preventScrollReset } = state;
10571057

10581058
// Trigger manual scroll restoration while we're active
10591059
React.useEffect(() => {
@@ -1125,13 +1125,13 @@ function useScrollRestoration({
11251125
}
11261126

11271127
// Opt out of scroll reset if this link requested it
1128-
if (resetScrollPosition === false) {
1128+
if (preventScrollReset === true) {
11291129
return;
11301130
}
11311131

11321132
// otherwise go to the top on new locations
11331133
window.scrollTo(0, 0);
1134-
}, [location, restoreScrollPosition, resetScrollPosition]);
1134+
}, [location, restoreScrollPosition, preventScrollReset]);
11351135
}
11361136

11371137
function useBeforeUnload(callback: () => any): void {

packages/react-router-dom/server.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ function getStatelessRemixRouter(
192192
initialized: true,
193193
navigation: IDLE_NAVIGATION,
194194
restoreScrollPosition: null,
195-
resetScrollPosition: true,
195+
preventScrollReset: false,
196196
revalidation: "idle" as RevalidationState,
197197
fetchers: new Map(),
198198
};

packages/react-router/lib/components.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,15 @@ export function DataRouterProvider({
8888
createHref: router.createHref,
8989
go: (n) => router.navigate(n),
9090
push: (to, state, opts) =>
91-
router.navigate(to, { state, resetScroll: opts?.resetScroll }),
91+
router.navigate(to, {
92+
state,
93+
preventScrollReset: opts?.preventScrollReset,
94+
}),
9295
replace: (to, state, opts) =>
9396
router.navigate(to, {
9497
replace: true,
9598
state,
96-
resetScroll: opts?.resetScroll,
99+
preventScrollReset: opts?.preventScrollReset,
97100
}),
98101
};
99102
}, [router]);

packages/react-router/lib/context.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export type RelativeRoutingType = "route" | "path";
6565
export interface NavigateOptions {
6666
replace?: boolean;
6767
state?: any;
68-
resetScroll?: boolean;
68+
preventScrollReset?: boolean;
6969
relative?: RelativeRoutingType;
7070
}
7171

packages/router/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ interface RouterState {
4545
// should not restore,m or null if we don't have a saved position
4646
// Note: must be enabled via router.enableScrollRestoration()
4747
restoreScrollPosition: number | false | null;
48-
// Proxied `resetScroll` value passed to router.navigate() (default true)
49-
resetScrollPosition: boolean;
48+
// Proxied `preventScrollReset` value passed to router.navigate() (default false)
49+
preventScrollReset: boolean;
5050
// Data from the loaders for the current matches
5151
loaderData: RouteData;
5252
// Data from the action for the current matches

0 commit comments

Comments
 (0)