Skip to content

Commit

Permalink
Refactor commitPlacement to recursively insert nodes
Browse files Browse the repository at this point in the history
  • Loading branch information
trueadm committed Feb 7, 2020
1 parent 256d78d commit 5dd6086
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 37 deletions.
8 changes: 4 additions & 4 deletions packages/react-dom/src/client/ReactDOMHostConfig.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ export type EventTargetChildElement = {
},
...
};
export type Container = Element | Document;
export type Container = DOMContainer;
export type Instance = Element;
export type TextInstance = Text;
export type SuspenseInstance = Comment & {_reactRetry?: () => void, ...};
Expand Down Expand Up @@ -411,7 +411,7 @@ export function commitTextUpdate(
}

export function appendChild(
parentInstance: Instance,
parentInstance: DOMContainer,
child: Instance | TextInstance,
): void {
parentInstance.appendChild(child);
Expand Down Expand Up @@ -448,15 +448,15 @@ export function appendChildToContainer(
}

export function insertBefore(
parentInstance: Instance,
parentInstance: DOMContainer,
child: Instance | TextInstance,
beforeChild: Instance | TextInstance | SuspenseInstance,
): void {
parentInstance.insertBefore(child, beforeChild);
}

export function insertInContainerBefore(
container: Container,
container: DOMContainer,
child: Instance | TextInstance,
beforeChild: Instance | TextInstance | SuspenseInstance,
): void {
Expand Down
67 changes: 34 additions & 33 deletions packages/react-reconciler/src/ReactFiberCommitWork.js
Original file line number Diff line number Diff line change
Expand Up @@ -1099,44 +1099,45 @@ function commitPlacement(finishedWork: Fiber): void {
const before = getHostSibling(finishedWork);
// We only have the top Fiber that was inserted but we need to recurse down its
// children to find all the terminal nodes.
let node: Fiber = finishedWork;
while (true) {
const isHost = node.tag === HostComponent || node.tag === HostText;
if (isHost || (enableFundamentalAPI && node.tag === FundamentalComponent)) {
const stateNode = isHost ? node.stateNode : node.stateNode.instance;
if (before) {
if (isContainer) {
insertInContainerBefore(parent, stateNode, before);
} else {
insertBefore(parent, stateNode, before);
}
insertOrAppendPlacementNode(finishedWork, before, parent, isContainer);
}

function insertOrAppendPlacementNode(
node: Fiber,
before: ?Instance,
parent: Container,
isContainer: boolean,
): void {
const isHost = node.tag === HostComponent || node.tag === HostText;
if (isHost || (enableFundamentalAPI && node.tag === FundamentalComponent)) {
const stateNode = isHost ? node.stateNode : node.stateNode.instance;
if (before) {
if (isContainer) {
insertInContainerBefore(parent, stateNode, before);
} else {
if (isContainer) {
appendChildToContainer(parent, stateNode);
} else {
appendChild(parent, stateNode);
}
insertBefore(parent, stateNode, before);
}
} else {
if (isContainer) {
appendChildToContainer(parent, stateNode);
} else {
appendChild(parent, stateNode);
}
} else if (node.tag === HostPortal) {
// If the insertion itself is a portal, then we don't want to traverse
// down its children. Instead, we'll get insertions from each child in
// the portal directly.
} else if (node.child !== null) {
node.child.return = node;
node = node.child;
continue;
}
if (node === finishedWork) {
return;
}
while (node.sibling === null) {
if (node.return === null || node.return === finishedWork) {
return;
} else if (node.tag === HostPortal) {
// If the insertion itself is a portal, then we don't want to traverse
// down its children. Instead, we'll get insertions from each child in
// the portal directly.
} else {
const child = node.child;
if (child !== null) {
insertOrAppendPlacementNode(child, before, parent, isContainer);
let sibling = child.sibling;
while (sibling !== null) {
insertOrAppendPlacementNode(sibling, before, parent, isContainer);
sibling = sibling.sibling;
}
node = node.return;
}
node.sibling.return = node.return;
node = node.sibling;
}
}

Expand Down

0 comments on commit 5dd6086

Please sign in to comment.