From 8bc0515fe211eae02ba3637f700c1502669cf45d Mon Sep 17 00:00:00 2001 From: Alexander Nanberg Date: Thu, 27 Apr 2023 21:40:46 +0200 Subject: [PATCH 1/3] Avoid unnecessary router subscribes (#10400) --- contributors.yml | 1 + packages/react-router/lib/components.tsx | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/contributors.yml b/contributors.yml index b2551439a8..c73c18999f 100644 --- a/contributors.yml +++ b/contributors.yml @@ -9,6 +9,7 @@ - akamfoad - alany411 - alberto +- alexandernanberg - alexlbr - AmRo045 - amsal diff --git a/packages/react-router/lib/components.tsx b/packages/react-router/lib/components.tsx index 9d9a40c10c..81575e36bb 100644 --- a/packages/react-router/lib/components.tsx +++ b/packages/react-router/lib/components.tsx @@ -63,11 +63,14 @@ export function RouterProvider({ // pick up on any render-driven redirects/navigations (useEffect/) React.useLayoutEffect(() => { return router.subscribe((newState) => { - if (newState !== state) { - setState(newState); - } + setState((prevState) => { + if (prevState !== newState) { + return newState; + } + return prevState; + }); }); - }, [router, state]); + }, [router]); let navigator = React.useMemo((): Navigator => { return { From 8119c671f528189bacd15035cec87bf11fd19268 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Thu, 27 Apr 2023 15:42:08 -0400 Subject: [PATCH 2/3] Add changeset --- .changeset/silent-stingrays-boil.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/silent-stingrays-boil.md diff --git a/.changeset/silent-stingrays-boil.md b/.changeset/silent-stingrays-boil.md new file mode 100644 index 0000000000..cb0320278e --- /dev/null +++ b/.changeset/silent-stingrays-boil.md @@ -0,0 +1,5 @@ +--- +"react-router": patch +--- + +Avoid uneccesary unsubscribe/resubscribes on router state changes From 7eeb1da5a76aa1e804e7b7bb9ca4eb450f7a27f8 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Thu, 27 Apr 2023 15:44:54 -0400 Subject: [PATCH 3/3] Simplify layoutEffect --- packages/react-router/lib/components.tsx | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/packages/react-router/lib/components.tsx b/packages/react-router/lib/components.tsx index 81575e36bb..1c526b830d 100644 --- a/packages/react-router/lib/components.tsx +++ b/packages/react-router/lib/components.tsx @@ -57,20 +57,10 @@ export function RouterProvider({ fallbackElement, router, }: RouterProviderProps): React.ReactElement { - let [state, setState] = React.useState(router.state); - // Need to use a layout effect here so we are subscribed early enough to // pick up on any render-driven redirects/navigations (useEffect/) - React.useLayoutEffect(() => { - return router.subscribe((newState) => { - setState((prevState) => { - if (prevState !== newState) { - return newState; - } - return prevState; - }); - }); - }, [router]); + let [state, setState] = React.useState(router.state); + React.useLayoutEffect(() => router.subscribe(setState), [router, setState]); let navigator = React.useMemo((): Navigator => { return {