From 67771d411a854da673fb7a872921c0c2d2640564 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Sat, 20 Oct 2018 12:38:04 -0400 Subject: [PATCH] pure -> memo --- ...ctDOMServerIntegrationSpecialTypes-test.js | 22 +++++++-------- .../src/server/ReactPartialRenderer.js | 4 +-- packages/react-reconciler/src/ReactFiber.js | 12 ++++---- .../src/ReactFiberBeginWork.js | 28 +++++++++---------- .../src/ReactFiberCompleteWork.js | 8 +++--- .../ReactIncrementalPerf-test.internal.js | 6 ++-- ...internal.js => ReactMemo-test.internal.js} | 26 ++++++++--------- ...ReactIncrementalPerf-test.internal.js.snap | 2 +- .../src/ReactTestRenderer.js | 10 +++---- packages/react/src/React.js | 4 +-- .../react/src/__tests__/forwardRef-test.js | 22 +++++++-------- packages/react/src/{pure.js => memo.js} | 8 +++--- packages/shared/ReactSymbols.js | 2 +- packages/shared/ReactWorkTags.js | 4 +-- packages/shared/getComponentName.js | 4 +-- packages/shared/isValidElementType.js | 4 +-- 16 files changed, 83 insertions(+), 83 deletions(-) rename packages/react-reconciler/src/__tests__/{ReactPure-test.internal.js => ReactMemo-test.internal.js} (93%) rename packages/react/src/{pure.js => memo.js} (78%) diff --git a/packages/react-dom/src/__tests__/ReactDOMServerIntegrationSpecialTypes-test.js b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationSpecialTypes-test.js index 71d062a45899..c34d979ac293 100644 --- a/packages/react-dom/src/__tests__/ReactDOMServerIntegrationSpecialTypes-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationSpecialTypes-test.js @@ -15,7 +15,7 @@ let React; let ReactDOM; let ReactDOMServer; let forwardRef; -let pure; +let memo; let yieldedValues; let yieldValue; let clearYields; @@ -27,7 +27,7 @@ function initModules() { ReactDOM = require('react-dom'); ReactDOMServer = require('react-dom/server'); forwardRef = React.forwardRef; - pure = React.pure; + memo = React.memo; yieldedValues = []; yieldValue = value => { @@ -83,7 +83,7 @@ describe('ReactDOMServerIntegration', () => { expect(div.textContent).toBe('Test'); }); - describe('pure functional components', () => { + describe('memoized functional components', () => { beforeEach(() => { resetModules(); }); @@ -98,39 +98,39 @@ describe('ReactDOMServerIntegration', () => { } itRenders('basic render', async render => { - const PureCounter = pure(Counter); - const domNode = await render(); + const MemoCounter = memo(Counter); + const domNode = await render(); expect(domNode.textContent).toEqual('Count: 0'); }); itRenders('composition with forwardRef', async render => { const RefCounter = (props, ref) => ; - const PureRefCounter = pure(forwardRef(RefCounter)); + const MemoRefCounter = memo(forwardRef(RefCounter)); const ref = React.createRef(); ref.current = 0; - await render(); + await render(); expect(clearYields()).toEqual(['Count: 0']); }); itRenders('with comparator', async render => { - const PureCounter = pure(Counter, (oldProps, newProps) => false); - await render(); + const MemoCounter = memo(Counter, (oldProps, newProps) => false); + await render(); expect(clearYields()).toEqual(['Count: 0']); }); itRenders( 'comparator functions are not invoked on the server', async render => { - const PureCounter = React.pure(Counter, (oldProps, newProps) => { + const MemoCounter = React.memo(Counter, (oldProps, newProps) => { yieldValue( `Old count: ${oldProps.count}, New count: ${newProps.count}`, ); return oldProps.count === newProps.count; }); - await render(); + await render(); expect(clearYields()).toEqual(['Count: 0']); }, ); diff --git a/packages/react-dom/src/server/ReactPartialRenderer.js b/packages/react-dom/src/server/ReactPartialRenderer.js index c45e56945283..6b482be43e37 100644 --- a/packages/react-dom/src/server/ReactPartialRenderer.js +++ b/packages/react-dom/src/server/ReactPartialRenderer.js @@ -39,7 +39,7 @@ import { REACT_PROVIDER_TYPE, REACT_CONTEXT_TYPE, REACT_LAZY_TYPE, - REACT_PURE_TYPE, + REACT_MEMO_TYPE, } from 'shared/ReactSymbols'; import { @@ -1002,7 +1002,7 @@ class ReactDOMServerRenderer { this.stack.push(frame); return ''; } - case REACT_PURE_TYPE: { + case REACT_MEMO_TYPE: { const element: ReactElement = ((nextChild: any): ReactElement); let nextChildren = [ React.createElement( diff --git a/packages/react-reconciler/src/ReactFiber.js b/packages/react-reconciler/src/ReactFiber.js index ff251cbf68c7..4bed6cbaf992 100644 --- a/packages/react-reconciler/src/ReactFiber.js +++ b/packages/react-reconciler/src/ReactFiber.js @@ -35,7 +35,7 @@ import { Profiler, SuspenseComponent, FunctionComponent, - PureComponent, + MemoComponent, LazyComponent, } from 'shared/ReactWorkTags'; import getComponentName from 'shared/getComponentName'; @@ -57,7 +57,7 @@ import { REACT_CONTEXT_TYPE, REACT_CONCURRENT_MODE_TYPE, REACT_SUSPENSE_TYPE, - REACT_PURE_TYPE, + REACT_MEMO_TYPE, REACT_LAZY_TYPE, } from 'shared/ReactSymbols'; @@ -315,8 +315,8 @@ export function resolveLazyComponentTag(Component: Function): WorkTag { if ($$typeof === REACT_FORWARD_REF_TYPE) { return ForwardRef; } - if ($$typeof === REACT_PURE_TYPE) { - return PureComponent; + if ($$typeof === REACT_MEMO_TYPE) { + return MemoComponent; } } return IndeterminateComponent; @@ -470,8 +470,8 @@ export function createFiberFromTypeAndProps( case REACT_FORWARD_REF_TYPE: fiberTag = ForwardRef; break getTag; - case REACT_PURE_TYPE: - fiberTag = PureComponent; + case REACT_MEMO_TYPE: + fiberTag = MemoComponent; break getTag; case REACT_LAZY_TYPE: fiberTag = LazyComponent; diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index cd65c864edad..386bc16ba33b 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -30,8 +30,8 @@ import { ContextConsumer, Profiler, SuspenseComponent, - PureComponent, - SimplePureComponent, + MemoComponent, + SimpleMemoComponent, LazyComponent, } from 'shared/ReactWorkTags'; import { @@ -231,7 +231,7 @@ function updateForwardRef( return workInProgress.child; } -function updatePureComponent( +function updateMemoComponent( current: Fiber | null, workInProgress: Fiber, Component: any, @@ -244,10 +244,10 @@ function updatePureComponent( if (isSimpleFunctionComponent(type) && Component.compare === null) { // If this is a plain function component without default props, // and with only the default shallow comparison, we upgrade it - // to a SimplePureComponent to allow fast path updates. - workInProgress.tag = SimplePureComponent; + // to a SimpleMemoComponent to allow fast path updates. + workInProgress.tag = SimpleMemoComponent; workInProgress.type = type; - return updateSimplePureComponent( + return updateSimpleMemoComponent( current, workInProgress, type, @@ -299,7 +299,7 @@ function updatePureComponent( return newChild; } -function updateSimplePureComponent( +function updateSimpleMemoComponent( current: Fiber | null, workInProgress: Fiber, Component: any, @@ -814,8 +814,8 @@ function mountLazyComponent( ); break; } - case PureComponent: { - child = updatePureComponent( + case MemoComponent: { + child = updateMemoComponent( null, workInProgress, Component, @@ -826,7 +826,7 @@ function mountLazyComponent( break; } default: { - // This message intentionally doesn't metion ForwardRef or PureComponent + // This message intentionally doesn't metion ForwardRef or MemoComponent // because the fact that it's a separate type of work is an // implementation detail. invariant( @@ -1612,11 +1612,11 @@ function beginWork( workInProgress, renderExpirationTime, ); - case PureComponent: { + case MemoComponent: { const type = workInProgress.type; const unresolvedProps = workInProgress.pendingProps; const resolvedProps = resolveDefaultProps(type.type, unresolvedProps); - return updatePureComponent( + return updateMemoComponent( current, workInProgress, type, @@ -1625,8 +1625,8 @@ function beginWork( renderExpirationTime, ); } - case SimplePureComponent: { - return updateSimplePureComponent( + case SimpleMemoComponent: { + return updateSimpleMemoComponent( current, workInProgress, workInProgress.type, diff --git a/packages/react-reconciler/src/ReactFiberCompleteWork.js b/packages/react-reconciler/src/ReactFiberCompleteWork.js index 12069b9f919d..c0657661a125 100644 --- a/packages/react-reconciler/src/ReactFiberCompleteWork.js +++ b/packages/react-reconciler/src/ReactFiberCompleteWork.js @@ -34,8 +34,8 @@ import { Mode, Profiler, SuspenseComponent, - PureComponent, - SimplePureComponent, + MemoComponent, + SimpleMemoComponent, LazyComponent, } from 'shared/ReactWorkTags'; import {Placement, Ref, Update} from 'shared/ReactSideEffectTags'; @@ -540,7 +540,7 @@ function completeWork( break; case LazyComponent: break; - case SimplePureComponent: + case SimpleMemoComponent: case FunctionComponent: break; case ClassComponent: { @@ -715,7 +715,7 @@ function completeWork( break; case ContextConsumer: break; - case PureComponent: + case MemoComponent: break; default: invariant( diff --git a/packages/react-reconciler/src/__tests__/ReactIncrementalPerf-test.internal.js b/packages/react-reconciler/src/__tests__/ReactIncrementalPerf-test.internal.js index 7faa68ce85ff..c8f4c2452300 100644 --- a/packages/react-reconciler/src/__tests__/ReactIncrementalPerf-test.internal.js +++ b/packages/react-reconciler/src/__tests__/ReactIncrementalPerf-test.internal.js @@ -555,13 +555,13 @@ describe('ReactDebugFiberPerf', () => { expect(getFlameChart()).toMatchSnapshot(); }); - it('supports pure', () => { - const PureFoo = React.pure(function Foo() { + it('supports memo', () => { + const MemoFoo = React.memo(function Foo() { return
; }); ReactNoop.render( - + , ); ReactNoop.flush(); diff --git a/packages/react-reconciler/src/__tests__/ReactPure-test.internal.js b/packages/react-reconciler/src/__tests__/ReactMemo-test.internal.js similarity index 93% rename from packages/react-reconciler/src/__tests__/ReactPure-test.internal.js rename to packages/react-reconciler/src/__tests__/ReactMemo-test.internal.js index 081e15cd034c..d6e1cba77c67 100644 --- a/packages/react-reconciler/src/__tests__/ReactPure-test.internal.js +++ b/packages/react-reconciler/src/__tests__/ReactMemo-test.internal.js @@ -16,7 +16,7 @@ let React; let ReactFeatureFlags; let ReactNoop; -describe('pure', () => { +describe('memo', () => { beforeEach(() => { jest.resetModules(); ReactFeatureFlags = require('shared/ReactFeatureFlags'); @@ -38,22 +38,22 @@ describe('pure', () => { return {default: result}; } - // Tests should run against both the lazy and non-lazy versions of `pure`. + // Tests should run against both the lazy and non-lazy versions of `memo`. // To make the tests work for both versions, we wrap the non-lazy version in // a lazy function component. sharedTests('normal', (...args) => { - const Pure = React.pure(...args); + const Memo = React.memo(...args); function Indirection(props) { - return ; + return ; } return React.lazy(() => fakeImport(Indirection)); }); sharedTests('lazy', (...args) => { - const Pure = React.pure(...args); - return React.lazy(() => fakeImport(Pure)); + const Memo = React.memo(...args); + return React.lazy(() => fakeImport(Memo)); }); - function sharedTests(label, pure) { + function sharedTests(label, memo) { describe(`${label}`, () => { it('bails out on props equality', async () => { const {unstable_Suspense: Suspense} = React; @@ -61,7 +61,7 @@ describe('pure', () => { function Counter({count}) { return ; } - Counter = pure(Counter); + Counter = memo(Counter); ReactNoop.render( }> @@ -108,7 +108,7 @@ describe('pure', () => { const count = readContext(CountContext); return ; } - Counter = pure(Counter); + Counter = memo(Counter); class Parent extends React.Component { state = {count: 0}; @@ -147,7 +147,7 @@ describe('pure', () => { function Counter({count}) { return ; } - Counter = pure(Counter, (oldProps, newProps) => { + Counter = memo(Counter, (oldProps, newProps) => { ReactNoop.yield( `Old count: ${oldProps.count}, New count: ${newProps.count}`, ); @@ -192,7 +192,7 @@ describe('pure', () => { return ; } } - const Counter = pure(CounterInner); + const Counter = memo(CounterInner); ReactNoop.render( }> @@ -224,8 +224,8 @@ describe('pure', () => { }); it('warns if first argument is undefined', () => { - expect(() => pure()).toWarnDev( - 'pure: The first argument must be a component. Instead ' + + expect(() => memo()).toWarnDev( + 'memo: The first argument must be a component. Instead ' + 'received: undefined', {withoutStack: true}, ); diff --git a/packages/react-reconciler/src/__tests__/__snapshots__/ReactIncrementalPerf-test.internal.js.snap b/packages/react-reconciler/src/__tests__/__snapshots__/ReactIncrementalPerf-test.internal.js.snap index f330c1f2944d..6ce37872239c 100644 --- a/packages/react-reconciler/src/__tests__/__snapshots__/ReactIncrementalPerf-test.internal.js.snap +++ b/packages/react-reconciler/src/__tests__/__snapshots__/ReactIncrementalPerf-test.internal.js.snap @@ -410,7 +410,7 @@ exports[`ReactDebugFiberPerf supports portals 1`] = ` " `; -exports[`ReactDebugFiberPerf supports pure 1`] = ` +exports[`ReactDebugFiberPerf supports memo 1`] = ` "⚛ (Waiting for async callback... will force flush in 5250 ms) ⚛ (React Tree Reconciliation: Completed Root) diff --git a/packages/react-test-renderer/src/ReactTestRenderer.js b/packages/react-test-renderer/src/ReactTestRenderer.js index 00bada86fb11..6a8996c609c6 100644 --- a/packages/react-test-renderer/src/ReactTestRenderer.js +++ b/packages/react-test-renderer/src/ReactTestRenderer.js @@ -27,8 +27,8 @@ import { Mode, ForwardRef, Profiler, - PureComponent, - SimplePureComponent, + MemoComponent, + SimpleMemoComponent, } from 'shared/ReactWorkTags'; import invariant from 'shared/invariant'; import ReactVersion from 'shared/ReactVersion'; @@ -167,7 +167,7 @@ function toTree(node: ?Fiber) { rendered: childrenToTree(node.child), }; case FunctionComponent: - case SimplePureComponent: + case SimpleMemoComponent: return { nodeType: 'component', type: node.type, @@ -192,7 +192,7 @@ function toTree(node: ?Fiber) { case Mode: case Profiler: case ForwardRef: - case PureComponent: + case MemoComponent: return childrenToTree(node.child); default: invariant( @@ -208,7 +208,7 @@ const validWrapperTypes = new Set([ ClassComponent, HostComponent, ForwardRef, - PureComponent, + MemoComponent, // Normally skipped, but used when there's more than one root child. HostRoot, ]); diff --git a/packages/react/src/React.js b/packages/react/src/React.js index c3d0eed50935..a1fa6f607bc2 100644 --- a/packages/react/src/React.js +++ b/packages/react/src/React.js @@ -26,7 +26,7 @@ import { import {createContext} from './ReactContext'; import {lazy} from './ReactLazy'; import forwardRef from './forwardRef'; -import pure from './pure'; +import memo from './memo'; import { createElementWithValidation, createFactoryWithValidation, @@ -50,7 +50,7 @@ const React = { createContext, forwardRef, lazy, - pure, + memo, Fragment: REACT_FRAGMENT_TYPE, StrictMode: REACT_STRICT_MODE_TYPE, diff --git a/packages/react/src/__tests__/forwardRef-test.js b/packages/react/src/__tests__/forwardRef-test.js index e7ef1ffeabbb..5bbcc86fd837 100644 --- a/packages/react/src/__tests__/forwardRef-test.js +++ b/packages/react/src/__tests__/forwardRef-test.js @@ -227,7 +227,7 @@ describe('forwardRef', () => { ); }); - it('should not bailout if forwardRef is not wrapped in pure', () => { + it('should not bailout if forwardRef is not wrapped in memo', () => { const Component = props =>
; let renderCount = 0; @@ -248,12 +248,12 @@ describe('forwardRef', () => { expect(renderCount).toBe(2); }); - it('should bailout if forwardRef is wrapped in pure', () => { + it('should bailout if forwardRef is wrapped in memo', () => { const Component = props =>
; let renderCount = 0; - const RefForwardingComponent = React.pure( + const RefForwardingComponent = React.memo( React.forwardRef((props, ref) => { renderCount++; return ; @@ -288,12 +288,12 @@ describe('forwardRef', () => { expect(renderCount).toBe(3); }); - it('should custom pure comparisons to compose', () => { + it('should custom memo comparisons to compose', () => { const Component = props =>
; let renderCount = 0; - const RefForwardingComponent = React.pure( + const RefForwardingComponent = React.memo( React.forwardRef((props, ref) => { renderCount++; return ; @@ -319,34 +319,34 @@ describe('forwardRef', () => { ReactNoop.flush(); expect(renderCount).toBe(2); - const ComposedPure = React.pure( + const ComposedMemo = React.memo( RefForwardingComponent, (o, p) => o.a === p.a && o.c === p.c, ); - ReactNoop.render(); + ReactNoop.render(); ReactNoop.flush(); expect(renderCount).toBe(3); // Changing just b no longer updates - ReactNoop.render(); + ReactNoop.render(); ReactNoop.flush(); expect(renderCount).toBe(3); // Changing just a and c updates - ReactNoop.render(); + ReactNoop.render(); ReactNoop.flush(); expect(renderCount).toBe(4); // Changing just c does not update - ReactNoop.render(); + ReactNoop.render(); ReactNoop.flush(); expect(renderCount).toBe(4); // Changing ref still rerenders const differentRef = React.createRef(); - ReactNoop.render(); + ReactNoop.render(); ReactNoop.flush(); expect(renderCount).toBe(5); diff --git a/packages/react/src/pure.js b/packages/react/src/memo.js similarity index 78% rename from packages/react/src/pure.js rename to packages/react/src/memo.js index dd981908470a..0fda3a8f67e0 100644 --- a/packages/react/src/pure.js +++ b/packages/react/src/memo.js @@ -5,12 +5,12 @@ * LICENSE file in the root directory of this source tree. */ -import {REACT_PURE_TYPE} from 'shared/ReactSymbols'; +import {REACT_MEMO_TYPE} from 'shared/ReactSymbols'; import isValidElementType from 'shared/isValidElementType'; import warningWithoutStack from 'shared/warningWithoutStack'; -export default function pure( +export default function memo( type: React$ElementType, compare?: (oldProps: Props, newProps: Props) => boolean, ) { @@ -18,14 +18,14 @@ export default function pure( if (!isValidElementType(type)) { warningWithoutStack( false, - 'pure: The first argument must be a component. Instead ' + + 'memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type, ); } } return { - $$typeof: REACT_PURE_TYPE, + $$typeof: REACT_MEMO_TYPE, type, compare: compare === undefined ? null : compare, }; diff --git a/packages/shared/ReactSymbols.js b/packages/shared/ReactSymbols.js index 2b8211474c38..cc86ccbeeb72 100644 --- a/packages/shared/ReactSymbols.js +++ b/packages/shared/ReactSymbols.js @@ -41,7 +41,7 @@ export const REACT_FORWARD_REF_TYPE = hasSymbol export const REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; -export const REACT_PURE_TYPE = hasSymbol ? Symbol.for('react.pure') : 0xead3; +export const REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; export const REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; const MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; diff --git a/packages/shared/ReactWorkTags.js b/packages/shared/ReactWorkTags.js index 9c03d889aa69..bb7bee12d9d5 100644 --- a/packages/shared/ReactWorkTags.js +++ b/packages/shared/ReactWorkTags.js @@ -42,6 +42,6 @@ export const ContextProvider = 10; export const ForwardRef = 11; export const Profiler = 12; export const SuspenseComponent = 13; -export const PureComponent = 14; -export const SimplePureComponent = 15; +export const MemoComponent = 14; +export const SimpleMemoComponent = 15; export const LazyComponent = 16; diff --git a/packages/shared/getComponentName.js b/packages/shared/getComponentName.js index 0bd5c0f71b18..cbea431c8f7a 100644 --- a/packages/shared/getComponentName.js +++ b/packages/shared/getComponentName.js @@ -16,7 +16,7 @@ import { REACT_FORWARD_REF_TYPE, REACT_FRAGMENT_TYPE, REACT_PORTAL_TYPE, - REACT_PURE_TYPE, + REACT_MEMO_TYPE, REACT_PROFILER_TYPE, REACT_PROVIDER_TYPE, REACT_STRICT_MODE_TYPE, @@ -79,7 +79,7 @@ function getComponentName(type: mixed): string | null { return 'Context.Provider'; case REACT_FORWARD_REF_TYPE: return getWrappedName(type, type.render, 'ForwardRef'); - case REACT_PURE_TYPE: + case REACT_MEMO_TYPE: return getComponentName(type.type); case REACT_LAZY_TYPE: { const thenable: LazyComponent = (type: any); diff --git a/packages/shared/isValidElementType.js b/packages/shared/isValidElementType.js index f662ce19fa69..d7296170cdc7 100644 --- a/packages/shared/isValidElementType.js +++ b/packages/shared/isValidElementType.js @@ -16,7 +16,7 @@ import { REACT_PROVIDER_TYPE, REACT_STRICT_MODE_TYPE, REACT_SUSPENSE_TYPE, - REACT_PURE_TYPE, + REACT_MEMO_TYPE, REACT_LAZY_TYPE, } from 'shared/ReactSymbols'; @@ -33,7 +33,7 @@ export default function isValidElementType(type: mixed) { (typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || - type.$$typeof === REACT_PURE_TYPE || + type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE))