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,