Skip to content

Commit f7d5c48

Browse files
committed
Implement forward ref and memo
1 parent efc0084 commit f7d5c48

File tree

1 file changed

+32
-5
lines changed

1 file changed

+32
-5
lines changed

packages/react-server/src/ReactFizzServer.js

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -728,22 +728,47 @@ function validateFunctionComponentInDev(Component: any): void {
728728
}
729729
}
730730

731+
function resolveDefaultProps(Component: any, baseProps: Object): Object {
732+
if (Component && Component.defaultProps) {
733+
// Resolve default props. Taken from ReactElement
734+
const props = Object.assign({}, baseProps);
735+
const defaultProps = Component.defaultProps;
736+
for (const propName in defaultProps) {
737+
if (props[propName] === undefined) {
738+
props[propName] = defaultProps[propName];
739+
}
740+
}
741+
return props;
742+
}
743+
return baseProps;
744+
}
745+
731746
function renderForwardRef(
732747
request: Request,
733748
task: Task,
734749
type: any,
735750
props: Object,
751+
ref: any,
736752
): void {
737-
throw new Error('Not yet implemented element type.');
753+
renderWithHooks(request, task, type, props, ref);
738754
}
739755

740756
function renderMemo(
741757
request: Request,
742758
task: Task,
743759
type: any,
744760
props: Object,
761+
ref: any,
745762
): void {
746-
throw new Error('Not yet implemented element type.');
763+
const innerType = type.type;
764+
const resolvedProps = resolveDefaultProps(innerType, props);
765+
renderElement(
766+
request,
767+
task,
768+
innerType,
769+
resolvedProps,
770+
ref,
771+
);
747772
}
748773

749774
function renderContextConsumer(
@@ -835,6 +860,7 @@ function renderElement(
835860
task: Task,
836861
type: any,
837862
props: Object,
863+
ref: any,
838864
): void {
839865
if (typeof type === 'function') {
840866
if (shouldConstruct(type)) {
@@ -877,11 +903,11 @@ function renderElement(
877903
if (typeof type === 'object' && type !== null) {
878904
switch (type.$$typeof) {
879905
case REACT_FORWARD_REF_TYPE: {
880-
renderForwardRef(request, task, type, props);
906+
renderForwardRef(request, task, type, props, ref);
881907
return;
882908
}
883909
case REACT_MEMO_TYPE: {
884-
renderMemo(request, task, type, props);
910+
renderMemo(request, task, type, props, ref);
885911
return;
886912
}
887913
case REACT_PROVIDER_TYPE: {
@@ -961,7 +987,8 @@ function renderNodeDestructive(
961987
const element: React$Element<any> = (node: any);
962988
const type = element.type;
963989
const props = element.props;
964-
renderElement(request, task, type, props);
990+
const ref = element.ref;
991+
renderElement(request, task, type, props, ref);
965992
return;
966993
}
967994
case REACT_PORTAL_TYPE:

0 commit comments

Comments
 (0)