1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| const PLACEMENT = 1; const DELETION = 2; const UPDATE = 3;
function arrify(val) { return val == null ? [] : Array.isArray(val) ? val : [val]; }
function reconcileChildrenArray(wipFiber, newChildElements) { const elements = arrify(newChildElements);
let index = 0; let oldFiber = wipFiber.alternate ? wipFiber.alternate.child : null; let newFiber = null; while (index < elements.length || oldFiber != null) { const prevFiber = newFiber; const element = index < elements.length && elements[index]; const sameType = oldFiber && element && element.type == oldFiber.type;
if (sameType) { newFiber = { type: oldFiber.type, tag: oldFiber.tag, stateNode: oldFiber.stateNode, props: element.props, parent: wipFiber, alternate: oldFiber, partialState: oldFiber.partialState, effectTag: UPDATE }; }
if (element && !sameType) { newFiber = { type: element.type, tag: typeof element.type === "string" ? HOST_COMPONENT : CLASS_COMPONENT, props: element.props, parent: wipFiber, effectTag: PLACEMENT }; }
if (oldFiber && !sameType) { oldFiber.effectTag = DELETION; wipFiber.effects = wipFiber.effects || []; wipFiber.effects.push(oldFiber); }
if (oldFiber) { oldFiber = oldFiber.sibling; }
if (index == 0) { wipFiber.child = newFiber; } else if (prevFiber && element) { prevFiber.sibling = newFiber; }
index++; } }
|