MountedVNode,
RenderNode,
createTextVNode,
+ cloneVNode,
VNodeChildren
} from './vdom'
import { ComponentInstance } from './component'
endNode: RenderNode | null
) {
for (let i = 0; i < children.length; i++) {
+ let child = children[i]
+ if (child.el) {
+ children[i] = child = cloneVNode(child)
+ }
mount(children[i], container, contextVNode, isSVG, endNode)
}
}
contextVNode: MountedVNode | null,
isSVG: boolean
) {
- if (prevVNode === nextVNode) {
- nextVNode.el = prevVNode.el
- return
- }
-
const nextFlags = nextVNode.flags
const prevFlags = prevVNode.flags
for (i; i < commonLength; i++) {
nextChild = nextChildren[i]
prevChild = prevChildren[i]
+ if (nextChild.el) {
+ nextChildren[i] = nextChild = cloneVNode(nextChild)
+ }
patch(prevChild, nextChild, container, contextVNode, isSVG)
prevChildren[i] = nextChild as MountedVNode
}
if (prevLength < nextLength) {
for (i = commonLength; i < nextLength; i++) {
- mount(nextChildren[i], container, contextVNode, isSVG, endNode)
+ nextChild = nextChildren[i]
+ if (nextChild.el) {
+ nextChildren[i] = nextChild = cloneVNode(nextChild)
+ }
+ mount(nextChild, container, contextVNode, isSVG, endNode)
}
} else if (prevLength > nextLength) {
for (i = commonLength; i < prevLength; i++) {
outer: {
// Sync nodes with the same key at the beginning.
while (prevVNode.key === nextVNode.key) {
+ if (nextVNode.el) {
+ nextChildren[j] = nextVNode = cloneVNode(nextVNode)
+ }
patch(prevVNode, nextVNode, container, contextVNode, isSVG)
prevChildren[j] = nextVNode as MountedVNode
j++
// Sync nodes with the same key at the end.
while (prevVNode.key === nextVNode.key) {
+ if (nextVNode.el) {
+ nextChildren[nextEnd] = nextVNode = cloneVNode(nextVNode)
+ }
patch(prevVNode, nextVNode, container, contextVNode, isSVG)
prevChildren[prevEnd] = nextVNode as MountedVNode
prevEnd--
const nextNode =
nextPos < nextLength ? nextChildren[nextPos].el : endNode
while (j <= nextEnd) {
- nextVNode = nextChildren[j++]
+ nextVNode = nextChildren[j]
+ if (nextVNode.el) {
+ nextChildren[j] = nextVNode = cloneVNode(nextVNode)
+ }
+ j++
mount(nextVNode, container, contextVNode, isSVG, nextNode)
}
}
} else {
pos = j
}
+ if (nextVNode.el) {
+ nextChildren[j] = nextVNode = cloneVNode(nextVNode)
+ }
patch(prevVNode, nextVNode, container, contextVNode, isSVG)
patched++
break
} else {
pos = j
}
+ if (nextVNode.el) {
+ nextChildren[j] = nextVNode = cloneVNode(nextVNode)
+ }
patch(prevVNode, nextVNode, container, contextVNode, isSVG)
patched++
} else if (!canRemoveWholeContent) {
if (sources[i] === 0) {
pos = i + nextStart
nextVNode = nextChildren[pos]
+ if (nextVNode.el) {
+ nextChildren[pos] = nextVNode = cloneVNode(nextVNode)
+ }
nextPos = pos + 1
mount(
nextVNode,
if (sources[i] === 0) {
pos = i + nextStart
nextVNode = nextChildren[pos]
+ if (nextVNode.el) {
+ nextChildren[pos] = nextVNode = cloneVNode(nextVNode)
+ }
nextPos = pos + 1
mount(
nextVNode,
} else {
platformRemoveChild(container, el)
}
+ ;(vnode as any).el = null
}
- ;(vnode as any).el = null
}
function queueRemoveChildren(
function render(vnode: VNode | null, container: any) {
const prevVNode = container.vnode
+ if (vnode && vnode.el) {
+ vnode = cloneVNode(vnode)
+ }
if (prevVNode == null) {
if (vnode) {
mount(vnode, container, null, false, null)