|
@@ -139,6 +139,7 @@ export interface RendererInternals<
|
|
|
> {
|
|
> {
|
|
|
p: PatchFn
|
|
p: PatchFn
|
|
|
um: UnmountFn
|
|
um: UnmountFn
|
|
|
|
|
+ r: RemoveFn
|
|
|
m: MoveFn
|
|
m: MoveFn
|
|
|
mt: MountComponentFn
|
|
mt: MountComponentFn
|
|
|
mc: MountChildrenFn
|
|
mc: MountChildrenFn
|
|
@@ -210,6 +211,8 @@ type UnmountFn = (
|
|
|
doRemove?: boolean
|
|
doRemove?: boolean
|
|
|
) => void
|
|
) => void
|
|
|
|
|
|
|
|
|
|
+type RemoveFn = (vnode: VNode) => void
|
|
|
|
|
+
|
|
|
type UnmountChildrenFn = (
|
|
type UnmountChildrenFn = (
|
|
|
children: VNode[],
|
|
children: VNode[],
|
|
|
parentComponent: ComponentInternalInstance | null,
|
|
parentComponent: ComponentInternalInstance | null,
|
|
@@ -1688,6 +1691,11 @@ function baseCreateRenderer(
|
|
|
unmountChildren(children as VNode[], parentComponent, parentSuspense)
|
|
unmountChildren(children as VNode[], parentComponent, parentSuspense)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // an unmounted portal should always remove its children
|
|
|
|
|
+ if (shapeFlag & ShapeFlags.PORTAL) {
|
|
|
|
|
+ ;(vnode.type as typeof PortalImpl).remove(vnode, internals)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if (doRemove) {
|
|
if (doRemove) {
|
|
|
remove(vnode)
|
|
remove(vnode)
|
|
|
}
|
|
}
|
|
@@ -1702,7 +1710,7 @@ function baseCreateRenderer(
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const remove = (vnode: VNode) => {
|
|
|
|
|
|
|
+ const remove: RemoveFn = vnode => {
|
|
|
const { type, el, anchor, transition } = vnode
|
|
const { type, el, anchor, transition } = vnode
|
|
|
if (type === Fragment) {
|
|
if (type === Fragment) {
|
|
|
removeFragment(el!, anchor!)
|
|
removeFragment(el!, anchor!)
|
|
@@ -1888,6 +1896,7 @@ function baseCreateRenderer(
|
|
|
p: patch,
|
|
p: patch,
|
|
|
um: unmount,
|
|
um: unmount,
|
|
|
m: move,
|
|
m: move,
|
|
|
|
|
+ r: remove,
|
|
|
mt: mountComponent,
|
|
mt: mountComponent,
|
|
|
mc: mountChildren,
|
|
mc: mountChildren,
|
|
|
pc: patchChildren,
|
|
pc: patchChildren,
|