diff --git a/packages/react-dom/src/__tests__/ReactDOMServerIntegrationHooks-test.internal.js b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationHooks-test.internal.js index 8c991c9ebe..a616ff395f 100644 --- a/packages/react-dom/src/__tests__/ReactDOMServerIntegrationHooks-test.internal.js +++ b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationHooks-test.internal.js @@ -646,5 +646,21 @@ describe('ReactDOMServerHooks', () => { expect(domNode.lastChild.textContent).toEqual('Baz: 5'); }, ); + + itThrowsWhenRendering( + 'if used inside a class component', + async render => { + const Context = React.createContext({}, () => {}); + class Counter extends React.Component { + render() { + let [count] = useContext(Context); + return ; + } + } + + return render(); + }, + 'Hooks can only be called inside the body of a function component.', + ); }); }); diff --git a/packages/react-dom/src/server/ReactPartialRendererHooks.js b/packages/react-dom/src/server/ReactPartialRendererHooks.js index bec21679c1..1bebbc7444 100644 --- a/packages/react-dom/src/server/ReactPartialRendererHooks.js +++ b/packages/react-dom/src/server/ReactPartialRendererHooks.js @@ -138,10 +138,18 @@ export function finishHooks( return children; } +function readContext( + context: ReactContext, + observedBits: void | number | boolean, +): T { + return context._currentValue; +} + function useContext( context: ReactContext, observedBits: void | number | boolean, ): T { + resolveCurrentlyRenderingComponent(); return context._currentValue; } @@ -349,7 +357,7 @@ function inputsAreEqual(arr1, arr2) { function noop(): void {} export const Dispatcher = { - readContext: useContext, + readContext, useContext, useMemo, useReducer,