fix(hmr): deep clone reused hoisted trees during dev
fix vitejs/vite#2022
This commit is contained in:
parent
c69f4ea857
commit
5a7a1b8293
@ -459,7 +459,7 @@ export function cloneVNode<T, U>(
|
||||
): VNode<T, U> {
|
||||
// This is intentionally NOT using spread or extend to avoid the runtime
|
||||
// key enumeration cost.
|
||||
const { props, ref, patchFlag } = vnode
|
||||
const { props, ref, patchFlag, children } = vnode
|
||||
const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props
|
||||
return {
|
||||
__v_isVNode: true,
|
||||
@ -479,7 +479,10 @@ export function cloneVNode<T, U>(
|
||||
: normalizeRef(extraProps)
|
||||
: ref,
|
||||
scopeId: vnode.scopeId,
|
||||
children: vnode.children,
|
||||
children:
|
||||
__DEV__ && patchFlag === PatchFlags.HOISTED && isArray(children)
|
||||
? (children as VNode[]).map(deepCloneVNode)
|
||||
: children,
|
||||
target: vnode.target,
|
||||
targetAnchor: vnode.targetAnchor,
|
||||
staticCount: vnode.staticCount,
|
||||
@ -513,6 +516,18 @@ export function cloneVNode<T, U>(
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Dev only, for HMR of hoisted vnodes reused in v-for
|
||||
* https://github.com/vitejs/vite/issues/2022
|
||||
*/
|
||||
function deepCloneVNode(vnode: VNode): VNode {
|
||||
const cloned = cloneVNode(vnode)
|
||||
if (isArray(vnode.children)) {
|
||||
cloned.children = (vnode.children as VNode[]).map(deepCloneVNode)
|
||||
}
|
||||
return cloned
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user