Skip to content

Commit d38ec17

Browse files
authored
[Flight] Set dispatcher for duration of performWork() (#19776)
1 parent 4f3f7ee commit d38ec17

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

packages/react-server/src/ReactFlightServer.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -273,11 +273,9 @@ export function resolveModelToJSON(
273273
value !== null &&
274274
value.$$typeof === REACT_ELEMENT_TYPE
275275
) {
276-
const prevDispatcher = ReactCurrentDispatcher.current;
277276
// TODO: Concatenate keys of parents onto children.
278277
const element: React$Element<any> = (value: any);
279278
try {
280-
ReactCurrentDispatcher.current = Dispatcher;
281279
// Attempt to render the server component.
282280
value = attemptResolveElement(element);
283281
} catch (x) {
@@ -292,8 +290,6 @@ export function resolveModelToJSON(
292290
// Something errored. Don't bother encoding anything up to here.
293291
throw x;
294292
}
295-
} finally {
296-
ReactCurrentDispatcher.current = prevDispatcher;
297293
}
298294
}
299295

@@ -355,6 +351,9 @@ function retrySegment(request: Request, segment: Segment): void {
355351
}
356352

357353
function performWork(request: Request): void {
354+
const prevDispatcher = ReactCurrentDispatcher.current;
355+
ReactCurrentDispatcher.current = Dispatcher;
356+
358357
const pingedSegments = request.pingedSegments;
359358
request.pingedSegments = [];
360359
for (let i = 0; i < pingedSegments.length; i++) {
@@ -364,6 +363,8 @@ function performWork(request: Request): void {
364363
if (request.flowing) {
365364
flushCompletedChunks(request);
366365
}
366+
367+
ReactCurrentDispatcher.current = prevDispatcher;
367368
}
368369

369370
let reentrant = false;

packages/react-transport-dom-relay/src/__tests__/ReactFlightDOMRelay-test.internal.js

+18
Original file line numberDiff line numberDiff line change
@@ -213,4 +213,22 @@ describe('ReactFlightDOMRelay', () => {
213213
},
214214
});
215215
});
216+
217+
it('can handle a subset of Hooks, with element as root', () => {
218+
const {useMemo, useCallback} = React;
219+
function Inner({x}) {
220+
const foo = useMemo(() => x + x, [x]);
221+
const bar = useCallback(() => 10 + foo, [foo]);
222+
return bar();
223+
}
224+
225+
function Foo() {
226+
return <Inner x={2} />;
227+
}
228+
const transport = [];
229+
ReactDOMFlightRelayServer.render(<Foo />, transport);
230+
231+
const model = readThrough(transport);
232+
expect(model).toEqual(14);
233+
});
216234
});

0 commit comments

Comments
 (0)