Skip to content

Commit 82cc491

Browse files
committed
old
1 parent b04aa7f commit 82cc491

File tree

3 files changed

+88
-87
lines changed

3 files changed

+88
-87
lines changed

packages/react-reconciler/src/ReactFiberBeginWork.old.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,8 +1323,7 @@ function updateHostRoot(current, workInProgress, renderLanes) {
13231323
element: nextChildren,
13241324
isDehydrated: false,
13251325
cache: nextState.cache,
1326-
pendingSuspenseBoundaries: nextState.pendingSuspenseBoundaries,
1327-
transitions: nextState.transitions,
1326+
incompleteTransitions: nextState.incompleteTransitions,
13281327
};
13291328
const updateQueue: UpdateQueue<RootState> = (workInProgress.updateQueue: any);
13301329
// `baseState` can always be the last state because the root doesn't
@@ -2107,6 +2106,7 @@ function updateSuspenseComponent(current, workInProgress, renderLanes) {
21072106
if (currentTransitions !== null) {
21082107
const primaryChildUpdateQueue: OffscreenQueue = {
21092108
transitions: currentTransitions,
2109+
markers: null,
21102110
};
21112111
primaryChildFragment.updateQueue = primaryChildUpdateQueue;
21122112
}
@@ -2182,6 +2182,8 @@ function updateSuspenseComponent(current, workInProgress, renderLanes) {
21822182
const primaryChildFragment: Fiber = (workInProgress.child: any);
21832183
const prevOffscreenState: OffscreenState | null = (current.child: any)
21842184
.memoizedState;
2185+
const prevOffscreenQueue: OffscreenQueue | null = (current.child: any)
2186+
.updateQueue;
21852187
primaryChildFragment.memoizedState =
21862188
prevOffscreenState === null
21872189
? mountSuspenseOffscreenState(renderLanes)
@@ -2191,6 +2193,8 @@ function updateSuspenseComponent(current, workInProgress, renderLanes) {
21912193
if (currentTransitions !== null) {
21922194
const primaryChildUpdateQueue: OffscreenQueue = {
21932195
transitions: currentTransitions,
2196+
markers:
2197+
prevOffscreenQueue === null ? null : prevOffscreenQueue.markers,
21942198
};
21952199
primaryChildFragment.updateQueue = primaryChildUpdateQueue;
21962200
}

packages/react-reconciler/src/ReactFiberCommitWork.old.js

Lines changed: 73 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,10 +1066,7 @@ function reappearLayoutEffectsOnFiber(node: Fiber) {
10661066
}
10671067
}
10681068

1069-
function commitTransitionProgress(
1070-
finishedRoot: FiberRoot,
1071-
offscreenFiber: Fiber,
1072-
) {
1069+
function commitTransitionProgress(offscreenFiber: Fiber) {
10731070
if (enableTransitionTracing) {
10741071
// This function adds suspense boundaries to the root
10751072
// or tracing marker's pendingSuspenseBoundaries map.
@@ -1094,12 +1091,7 @@ function commitTransitionProgress(
10941091
const wasHidden = prevState !== null;
10951092
const isHidden = nextState !== null;
10961093

1097-
const rootState: RootState = finishedRoot.current.memoizedState;
1098-
// TODO(luna) move pendingSuspenseBoundaries and transitions from
1099-
// HostRoot fiber to FiberRoot
1100-
const rootPendingBoundaries = rootState.pendingSuspenseBoundaries;
1101-
const rootTransitions = rootState.transitions;
1102-
1094+
const suspenseBoundaries = (offscreenFiber.updateQueue: any).markers;
11031095
// If there is a name on the suspense boundary, store that in
11041096
// the pending boundaries.
11051097
let name = null;
@@ -1112,38 +1104,26 @@ function commitTransitionProgress(
11121104
name = parent.memoizedProps.unstable_name;
11131105
}
11141106

1115-
if (rootPendingBoundaries !== null) {
1116-
if (previousFiber === null) {
1117-
// Initial mount
1118-
if (isHidden) {
1119-
rootPendingBoundaries.set(offscreenInstance, {
1107+
if (!wasHidden && isHidden) {
1108+
// The suspense boundaries was just hidden. Add the boundary
1109+
// to the pending boundary set if it's there
1110+
if (suspenseBoundaries !== null) {
1111+
suspenseBoundaries.forEach(pendingBoundaries => {
1112+
pendingBoundaries.set(offscreenInstance, {
11201113
name,
11211114
});
1122-
}
1123-
} else {
1124-
if (wasHidden && !isHidden) {
1125-
// The suspense boundary went from hidden to visible. Remove
1126-
// the boundary from the pending suspense boundaries set
1127-
// if it's there
1128-
if (rootPendingBoundaries.has(offscreenInstance)) {
1129-
rootPendingBoundaries.delete(offscreenInstance);
1130-
1131-
if (rootPendingBoundaries.size === 0 && rootTransitions !== null) {
1132-
rootTransitions.forEach(transition => {
1133-
addTransitionCompleteCallbackToPendingTransition({
1134-
transitionName: transition.name,
1135-
startTime: transition.startTime,
1136-
});
1137-
});
1138-
}
1115+
});
1116+
}
1117+
} else if (wasHidden && !isHidden) {
1118+
// The suspense boundary went from hidden to visible. Remove
1119+
// the boundary from the pending suspense boundaries set
1120+
// if it's there
1121+
if (suspenseBoundaries !== null) {
1122+
suspenseBoundaries.forEach(pendingBoundaries => {
1123+
if (pendingBoundaries.has(offscreenInstance)) {
1124+
pendingBoundaries.delete(offscreenInstance);
11391125
}
1140-
} else if (!wasHidden && isHidden) {
1141-
// The suspense boundaries was just hidden. Add the boundary
1142-
// to the pending boundary set if it's there
1143-
rootPendingBoundaries.set(offscreenInstance, {
1144-
name,
1145-
});
1146-
}
1126+
});
11471127
}
11481128
}
11491129
}
@@ -2830,45 +2810,46 @@ function commitPassiveMountOnFiber(
28302810
// Get the transitions that were initiatized during the render
28312811
// and add a start transition callback for each of them
28322812
const state = finishedWork.memoizedState;
2833-
// TODO Since it's a mutable field, this should live on the FiberRoot
2834-
if (state.transitions === null) {
2835-
state.transitions = new Set([]);
2836-
}
2837-
const pendingTransitions = state.transitions;
2838-
const pendingSuspenseBoundaries = state.pendingSuspenseBoundaries;
2839-
2813+
let incompleteTransitions = state.incompleteTransitions;
28402814
// Initial render
28412815
if (committedTransitions !== null) {
2816+
if (state.incompleteTransitions === null) {
2817+
state.incompleteTransitions = incompleteTransitions = new Map();
2818+
}
2819+
28422820
committedTransitions.forEach(transition => {
28432821
addTransitionStartCallbackToPendingTransition({
28442822
transitionName: transition.name,
28452823
startTime: transition.startTime,
28462824
});
2847-
pendingTransitions.add(transition);
2825+
2826+
if (!incompleteTransitions.has(transition)) {
2827+
incompleteTransitions.set(transition, null);
2828+
}
28482829
});
28492830

2850-
if (
2851-
pendingSuspenseBoundaries === null ||
2852-
pendingSuspenseBoundaries.size === 0
2853-
) {
2854-
pendingTransitions.forEach(transition => {
2831+
clearTransitionsForLanes(finishedRoot, committedLanes);
2832+
}
2833+
2834+
if (incompleteTransitions !== null) {
2835+
incompleteTransitions.forEach((pendingBoundaries, transition) => {
2836+
if (pendingBoundaries === null || pendingBoundaries.size === 0) {
28552837
addTransitionCompleteCallbackToPendingTransition({
28562838
transitionName: transition.name,
28572839
startTime: transition.startTime,
28582840
});
2859-
});
2860-
}
2861-
2862-
clearTransitionsForLanes(finishedRoot, committedLanes);
2841+
incompleteTransitions.delete(transition);
2842+
}
2843+
});
28632844
}
28642845

28652846
// If there are no more pending suspense boundaries we
28662847
// clear the transitions because they are all complete.
28672848
if (
2868-
pendingSuspenseBoundaries === null ||
2869-
pendingSuspenseBoundaries.size === 0
2849+
incompleteTransitions === null ||
2850+
incompleteTransitions.size === 0
28702851
) {
2871-
state.transitions = null;
2852+
state.incompleteTransitions = null;
28722853
}
28732854
}
28742855
break;
@@ -2911,37 +2892,50 @@ function commitPassiveMountOnFiber(
29112892
const rootMemoizedState = finishedRoot.current.memoizedState;
29122893

29132894
if (queue !== null) {
2914-
// We have one instance of the pendingSuspenseBoundaries map.
2915-
// We only need one because we update it during the commit phase.
2916-
// We instantiate a new Map if we haven't already
2917-
if (rootMemoizedState.pendingSuspenseBoundaries === null) {
2918-
rootMemoizedState.pendingSuspenseBoundaries = new Map();
2919-
}
2920-
29212895
if (isFallback) {
29222896
const transitions = queue.transitions;
29232897
let prevTransitions = finishedWork.memoizedState.transitions;
2924-
// Add all the transitions saved in the update queue during
2925-
// the render phase (ie the transitions associated with this boundary)
2926-
// into the transitions set.
2927-
if (transitions !== null) {
2928-
if (prevTransitions === null) {
2929-
// We only have one instance of the transitions set
2930-
// because we update it only during the commit phase. We
2931-
// will create the set on a as needed basis in the commit phase
2932-
finishedWork.memoizedState.transitions = prevTransitions = new Set();
2933-
}
2898+
let rootIncompleteTransitions =
2899+
rootMemoizedState.incompleteTransitions;
2900+
2901+
// We lazily instantiate transition tracing relevant maps
2902+
// and sets in the commit phase as we need to use them. We only
2903+
// instantiate them in the fallback phase on an as needed basis
2904+
if (rootMemoizedState.incompleteTransitions === null) {
2905+
rootMemoizedState.incompleteTransitions = rootIncompleteTransitions = new Map();
2906+
}
2907+
if (queue.markers === null) {
2908+
queue.markers = new Set();
2909+
}
2910+
if (transitions !== null && prevTransitions === null) {
2911+
finishedWork.memoizedState.transitions = prevTransitions = new Set();
2912+
}
29342913

2914+
if (transitions !== null) {
29352915
transitions.forEach(transition => {
2916+
// Add all the transitions saved in the update queue during
2917+
// the render phase (ie the transitions associated with this boundary)
2918+
// into the transitions set.
29362919
prevTransitions.add(transition);
2920+
2921+
// Add the root transition's pending suspense boundary set to
2922+
// the queue's marker set. We will iterate through the marker
2923+
// set when we toggle state on the suspense boundary and
2924+
// add or remove the pending suspense boundaries as needed.
2925+
if (!rootIncompleteTransitions.has(transition)) {
2926+
rootIncompleteTransitions.set(transition, new Map());
2927+
}
2928+
queue.markers.add(rootIncompleteTransitions.get(transition));
29372929
});
29382930
}
29392931
}
2940-
}
29412932

2942-
commitTransitionProgress(finishedRoot, finishedWork);
2933+
commitTransitionProgress(finishedWork);
29432934

2944-
finishedWork.updateQueue = null;
2935+
if (queue.markers === null || queue.markers.size === 0) {
2936+
finishedWork.updateQueue = null;
2937+
}
2938+
}
29452939
}
29462940

29472941
break;

packages/react-reconciler/src/ReactFiberRoot.old.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,13 @@ export type RootState = {
4545
element: any,
4646
isDehydrated: boolean,
4747
cache: Cache,
48-
pendingSuspenseBoundaries: PendingSuspenseBoundaries | null,
49-
transitions: Set<Transition> | null,
48+
// Transitions on the root can be represented as a bunch of tracing markers.
49+
// Each entangled group of transitions can be treated as a tracing marker.
50+
// It will have a set of pending suspense boundaries. These transitions
51+
// are considered complete when the pending suspense boundaries set is
52+
// empty. We can represent this as a Map of transitions to suspense
53+
// boundary sets
54+
incompleteTransitions: Map<Transition, PendingSuspenseBoundaries> | null,
5055
};
5156

5257
function FiberRootNode(
@@ -187,17 +192,15 @@ export function createFiberRoot(
187192
element: initialChildren,
188193
isDehydrated: hydrate,
189194
cache: initialCache,
190-
transitions: null,
191-
pendingSuspenseBoundaries: null,
195+
incompleteTransitions: null,
192196
};
193197
uninitializedFiber.memoizedState = initialState;
194198
} else {
195199
const initialState: RootState = {
196200
element: initialChildren,
197201
isDehydrated: hydrate,
198202
cache: (null: any), // not enabled yet
199-
transitions: null,
200-
pendingSuspenseBoundaries: null,
203+
incompleteTransitions: null,
201204
};
202205
uninitializedFiber.memoizedState = initialState;
203206
}

0 commit comments

Comments
 (0)