From ccb14e270c3376ed47ca43c0c39722ba6bf6eced Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Mon, 19 Nov 2018 20:47:38 +0000 Subject: [PATCH] Fix SSR useCallback in render phase (#14279) --- .../ReactDOMServerIntegrationHooks-test.internal.js | 13 +++++++++++++ .../src/server/ReactPartialRendererHooks.js | 7 +++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/react-dom/src/__tests__/ReactDOMServerIntegrationHooks-test.internal.js b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationHooks-test.internal.js index 37315929e4..421a4e074b 100644 --- a/packages/react-dom/src/__tests__/ReactDOMServerIntegrationHooks-test.internal.js +++ b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationHooks-test.internal.js @@ -516,6 +516,19 @@ describe('ReactDOMServerHooks', () => { expect(domNode.tagName).toEqual('SPAN'); expect(domNode.textContent).toEqual('Count: 0'); }); + + itRenders('should support render time callbacks', async render => { + function Counter(props) { + const renderCount = useCallback(increment => { + return 'Count: ' + (props.count + increment); + }); + return ; + } + const domNode = await render(); + expect(clearYields()).toEqual(['Count: 5']); + expect(domNode.tagName).toEqual('SPAN'); + expect(domNode.textContent).toEqual('Count: 5'); + }); }); describe('useImperativeMethods', () => { diff --git a/packages/react-dom/src/server/ReactPartialRendererHooks.js b/packages/react-dom/src/server/ReactPartialRendererHooks.js index 2860ee9bfb..2fe4dda9d0 100644 --- a/packages/react-dom/src/server/ReactPartialRendererHooks.js +++ b/packages/react-dom/src/server/ReactPartialRendererHooks.js @@ -341,6 +341,9 @@ function dispatchAction( } function noop(): void {} +function identity(fn: Function): Function { + return fn; +} export let currentThreadID: ThreadID = 0; @@ -357,10 +360,10 @@ export const Dispatcher = { useState, useMutationEffect, useLayoutEffect, + // Callbacks are passed as they are in the server environment. + useCallback: identity, // useImperativeMethods is not run in the server environment useImperativeMethods: noop, - // Callbacks are not run in the server environment. - useCallback: noop, // Effects are not run in the server environment. useEffect: noop, };