protected internalRemoveChild()

in packages/core/src/rendering/render-view.ts [185:213]


  protected internalRemoveChild(child: ChildType) {
    const childParentData = child.parentData!
    assert(this.debugUltimatePrevSiblingOf(child, this._firstChild))
    assert(this.debugUltimateNextSiblingOf(child, this._lastChild))
    assert(this._childCount >= 0)
    if (!childParentData.prevSibling) {
      // 子节点是 firstChild
      assert(this._firstChild === child)
      this._firstChild = childParentData.nextSibling
    } else {
      const childPrevSiblingParentData = childParentData.prevSibling.parentData!
      childPrevSiblingParentData.nextSibling = childParentData.nextSibling
    }
    if (!childParentData.nextSibling) {
      // 子节点是 lastChild
      assert(this._lastChild === child)
      this._lastChild = childParentData.prevSibling
    } else {
      const childNextSiblingParentData = childParentData.nextSibling.parentData!
      childNextSiblingParentData.prevSibling = childParentData.prevSibling
    }
    childParentData.prevSibling = undefined
    childParentData.nextSibling = undefined
    this._childCount -= 1
    if (this._yogaNode && child.yogaNode) {
      assert(child.yogaNode.getParent(), '子节点的 yogaNode 必须有 parent') // todo 检查 parent 的引用是否是 this.yogaNode
      this._yogaNode.removeChild(child.yogaNode)
    }
  }