diff --git a/packages/react-reconciler/src/__tests__/ReactMemo-test.js b/packages/react-reconciler/src/__tests__/ReactMemo-test.js index 5be63d65a3757..18fa2a5566878 100644 --- a/packages/react-reconciler/src/__tests__/ReactMemo-test.js +++ b/packages/react-reconciler/src/__tests__/ReactMemo-test.js @@ -516,7 +516,7 @@ describe('memo', () => { ); }); - it('should honor a inner displayName if set on the wrapped function', () => { + it('should honor a outter displayName when wrapped component and memo component set displayName at the same time.', () => { function Component(props) { return
; } @@ -532,8 +532,31 @@ describe('memo', () => { ReactNoop.render(), ).toErrorDev( 'Warning: Failed prop type: The prop `required` is marked as required in ' + - '`Foo`, but its value is `undefined`.\n' + - ' in Foo (at **)', + '`Bar`, but its value is `undefined`.\n' + + ' in Bar (at **)', + ); + }); + + it('can set react memo component displayName multiple times', () => { + function Component(props) { + return
; + } + Component.displayName = 'Foo'; + + const MemoComponent = React.memo(Component); + MemoComponent.displayName = 'MemoComp01'; + MemoComponent.displayName = 'MemoComp02'; + MemoComponent.displayName = 'MemoComp03'; + MemoComponent.propTypes = { + required: PropTypes.string.isRequired, + }; + + expect(() => + ReactNoop.render(), + ).toErrorDev( + 'Warning: Failed prop type: The prop `required` is marked as required in ' + + '`MemoComp03`, but its value is `undefined`.\n' + + ' in MemoComp03 (at **)', ); }); } diff --git a/packages/react/src/ReactMemo.js b/packages/react/src/ReactMemo.js index 2531c1a1879f0..796ba2e393cb8 100644 --- a/packages/react/src/ReactMemo.js +++ b/packages/react/src/ReactMemo.js @@ -36,9 +36,14 @@ export function memo( return ownName; }, set: function(name) { - ownName = name; - if (type.displayName == null) { + if (typeof name === 'string') { + ownName = name; type.displayName = name; + } else { + console.error( + "%s: is not valid displayName type, React memo's displayName should be a string", + typeof name, + ); } }, });