private internalRemoveChild()

in packages/core/src/rendering/render-chunk.tsx [445:474]


  private internalRemoveChild(child: ChildType) {
    const childParentData = child.parentData!
    assert(this.debugUltimatePrevSiblingOf(child, this._firstChild))
    assert(this.debugUltimateNextSiblingOf(child, this._lastChild))
    assert(childParentData.chunk === this, 'child 已分配的 chunk 不是自己')
    assert(this._childCount >= 0)
    if (!childParentData.prevSiblingInChunk) {
      // 子节点是 firstChild
      assert(this._firstChild === child)
      this._firstChild = childParentData.nextSiblingInChunk
    } else {
      const childPrevSiblingParentData = childParentData.prevSiblingInChunk.parentData!
      childPrevSiblingParentData.nextSiblingInChunk = childParentData.nextSiblingInChunk
    }
    if (!childParentData.nextSiblingInChunk) {
      // 子节点是 lastChild
      assert(this._lastChild === child)
      this._lastChild = childParentData.prevSiblingInChunk
    } else {
      const childNextSiblingParentData = childParentData.nextSiblingInChunk.parentData!
      childNextSiblingParentData.prevSiblingInChunk = childParentData.prevSiblingInChunk
    }
    childParentData.prevSiblingInChunk = undefined
    childParentData.nextSiblingInChunk = undefined
    childParentData.chunk = undefined
    child.offstage = true
    this._childCount -= 1
    this._layoutDirty = true
    this._paintDirty = true
  }