diff --git a/backend/attachRendererFiber.js b/backend/attachRendererFiber.js index a7e061b105..ccef2651b2 100644 --- a/backend/attachRendererFiber.js +++ b/backend/attachRendererFiber.js @@ -17,6 +17,22 @@ var semver = require('semver'); var copyWithSet = require('./copyWithSet'); var getDisplayName = require('./getDisplayName'); +// Taken from ReactElement. +function resolveDefaultProps(Component: any, baseProps: Object): Object { + if (Component && Component.defaultProps) { + // Resolve default props. Taken from ReactElement + const props = Object.assign({}, baseProps); + const defaultProps = Component.defaultProps; + for (const propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } + return props; + } + return baseProps; +} + function getInternalReactConstants(version) { var ReactTypeOfWork; var ReactSymbols; @@ -354,6 +370,14 @@ function attachRendererFiber(hook: Hook, rid: string, renderer: ReactRenderer): break; } + if ( + props !== null && + typeof fiber.elementType !== undefined && + fiber.type !== fiber.elementType + ) { + props = resolveDefaultProps(fiber.type, props); + } + if (Array.isArray(children)) { let child = fiber.child; while (child) { diff --git a/test/regression/shared.js b/test/regression/shared.js index 6f4af22597..c44fba2dce 100644 --- a/test/regression/shared.js +++ b/test/regression/shared.js @@ -103,6 +103,27 @@ switch (major) { ); + + // lazy + const LazyWithDefaultProps = React.lazy(() => new Promise(resolve => { + function FooWithDefaultProps(props) { + return

{props.greeting}, {props.name}

; + } + FooWithDefaultProps.defaultProps = { + name: 'World', + greeting: 'Bonjour', + }; + resolve({ + default: FooWithDefaultProps, + }); + })); + apps.push( + + loading...}> + + + + ); case 5: case 4: // unstable_Profiler