From fb2a3d3a018ad51d4a5ca6c95f44d530c88c2876 Mon Sep 17 00:00:00 2001 From: Pedro Fontoura Date: Tue, 25 Feb 2025 12:50:32 -0300 Subject: [PATCH 1/2] Add TraceUpdateRepro to DevTools test harness --- .../src/app/TraceUpdateRepro/index.js | 46 +++++++++++++++++++ .../react-devtools-shell/src/app/index.js | 2 + 2 files changed, 48 insertions(+) create mode 100644 packages/react-devtools-shell/src/app/TraceUpdateRepro/index.js diff --git a/packages/react-devtools-shell/src/app/TraceUpdateRepro/index.js b/packages/react-devtools-shell/src/app/TraceUpdateRepro/index.js new file mode 100644 index 0000000000000..1232a154e0419 --- /dev/null +++ b/packages/react-devtools-shell/src/app/TraceUpdateRepro/index.js @@ -0,0 +1,46 @@ +import * as React from 'react'; +import {useEffect, useRef, useState} from 'react'; + +function ShouldReRender() { + // Used just to trigger the re-render + const [, setCount] = useState(0); + + const renders = useRef(0); + renders.current += 1; + + useEffect(() => { + const interval = setInterval(() => { + setCount(value => value + 1); + }, 500); + return () => clearInterval(interval); + }, [setCount]); + + return

Should re-render count: {renders.current}x

; +} + +function ShouldNotReRender() { + const renders = useRef(0); + renders.current += 1; + return

Should not re-render count: {renders.current}x

; +} + +export default function TraceUpdateRepro() { + return ( + <> + + + {/* This one isn't highlighted... */} + + + {/* These ones are highlighted. I wonder if there is some sort of tree depth check?*/} +
+ +
+
+
+ +
+
+ + ); +} diff --git a/packages/react-devtools-shell/src/app/index.js b/packages/react-devtools-shell/src/app/index.js index 11f13bec47b22..2e03334c152da 100644 --- a/packages/react-devtools-shell/src/app/index.js +++ b/packages/react-devtools-shell/src/app/index.js @@ -19,6 +19,7 @@ import Toggle from './Toggle'; import ErrorBoundaries from './ErrorBoundaries'; import PartiallyStrictApp from './PartiallyStrictApp'; import SuspenseTree from './SuspenseTree'; +import TraceUpdateRepro from './TraceUpdateRepro'; import {ignoreErrors, ignoreLogs, ignoreWarnings} from './console'; import './styles.css'; @@ -112,6 +113,7 @@ function mountTestApp() { mountApp(SuspenseTree); mountApp(DeeplyNestedComponents); mountApp(Iframe); + mountApp(TraceUpdateRepro); if (shouldRenderLegacy) { mountLegacyApp(PartiallyStrictApp); From 5e65a61af2b21157acb9e40bc78325e053c6c7c3 Mon Sep 17 00:00:00 2001 From: Pedro Fontoura Date: Tue, 25 Feb 2025 14:22:31 -0300 Subject: [PATCH 2/2] Don't fallback to descendants when tracing updates --- .../src/backend/fiber/renderer.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/packages/react-devtools-shared/src/backend/fiber/renderer.js b/packages/react-devtools-shared/src/backend/fiber/renderer.js index ef8bac0099a2b..5c9df9baaf71e 100644 --- a/packages/react-devtools-shared/src/backend/fiber/renderer.js +++ b/packages/react-devtools-shared/src/backend/fiber/renderer.js @@ -3419,18 +3419,6 @@ export function attach( // I.e. we just restore them by undoing what we did above. fiberInstance.firstChild = remainingReconcilingChildren; remainingReconcilingChildren = null; - - if (traceUpdatesEnabled) { - // If we're tracing updates and we've bailed out before reaching a host node, - // we should fall back to recursively marking the nearest host descendants for highlight. - if (traceNearestHostComponentUpdate) { - const hostInstances = - findAllCurrentHostInstances(fiberInstance); - hostInstances.forEach(hostInstance => { - traceUpdatesForNodes.add(hostInstance); - }); - } - } } else { // If this fiber is filtered there might be changes to this set elsewhere so we have // to visit each child to place it back in the set. We let the child bail out instead.