关于react.js:React-reconcileChildren

183次阅读

共计 2575 个字符,预计需要花费 7 分钟才能阅读完成。

reconcileChildren

params

  1. current
  2. workInProgress
  3. nextChildren

    • class 组件: instance.render()
    • 函数组件: return 的值
  4. renderLanes
function reconcileChildren(current, workInProgress, nextChildren, renderLanes) {if (current === null) {
workInProgress.child = mountChildFibers(
workInProgress,
null,
nextChildren,
renderLanes
);
} else {
workInProgress.child = reconcileChildFibers(
workInProgress,
current.child,
nextChildren,
renderLanes
);
}
}

reconcileChildFibers

params

  1. returnFiber
  2. currentFirstChild
  3. newChild

    • class 组件: instance.render()
    • 函数组件: return 的值
  4. lanes
function reconcileChildFibers(returnFiber, currentFirstChild, newChild, lanes) {
var isUnkeyedTopLevelFragment =
typeof newChild === "object" &&
newChild !== null &&
newChild.type === REACT_FRAGMENT_TYPE &&
newChild.key === null;
if (isUnkeyedTopLevelFragment) {newChild = newChild.props.children;}
var isObject = typeof newChild === "object" && newChild !== null;
if (isObject) {switch (newChild.$$typeof) {
// reconcileSingleElement
case REACT_ELEMENT_TYPE:
return placeSingleChild(
reconcileSingleElement(
returnFiber,
currentFirstChild,
newChild,
lanes
)
);
case REACT_PORTAL_TYPE:
return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, lanes)
);
}
}
if (typeof newChild === "string" || typeof newChild === "number") {
return placeSingleChild(
reconcileSingleTextNode(
returnFiber,
currentFirstChild,
"" + newChild,
lanes
)
);
}
// 数组时
if (isArray$1(newChild)) {
return reconcileChildrenArray(
returnFiber,
currentFirstChild,
newChild,
lanes
);
}
if (getIteratorFn(newChild)) {
return reconcileChildrenIterator(
returnFiber,
currentFirstChild,
newChild,
lanes
);
}
if (isObject) {throwOnInvalidObjectType(returnFiber, newChild);
}
{if (typeof newChild === "function") {warnOnFunctionType(returnFiber);
}
}
if (typeof newChild === "undefined" && !isUnkeyedTopLevelFragment) {switch (returnFiber.tag) {
case ClassComponent: {
{
var instance = returnFiber.stateNode;
if (instance.render._isMockFunction) {break;}
}
}
case Block:
case FunctionComponent:
case ForwardRef:
case SimpleMemoComponent: {
{
{
throw Error((getComponentName(returnFiber.type) || "Component") +
"(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null."
);
}
}
}
}
}
return deleteRemainingChildren(returnFiber, currentFirstChild);
}

createFiberFromElement

params

  1. element: ReactElement 对象
  2. mode
  3. lanes

性能

  1. 执行 createFiberFromTypeAndProps,创立 Fiber

    • 创立 createFiber: fiber.elementType = type;

代码

function createFiberFromElement(element, mode, lanes) {
var owner = null;
{owner = element._owner;}
var type = element.type;
var key = element.key;
var pendingProps = element.props;
var fiber = createFiberFromTypeAndProps(
type,
key,
pendingProps, // element.props
owner,
mode,
lanes
);
{
fiber._debugSource = element._source;
fiber._debugOwner = element._owner;
}
return fiber;
}

正文完
 0