mirror of https://github.com/vuejs/core.git
fix(runtime-core): avoid hoisted vnodes retaining detached DOM nodes
fix #6591
This commit is contained in:
parent
ab8bfac0a1
commit
fc5bdb36ed
|
|
@ -13,7 +13,6 @@ import {
|
|||
import {
|
||||
FRAGMENT,
|
||||
RENDER_LIST,
|
||||
CREATE_TEXT,
|
||||
NORMALIZE_CLASS
|
||||
} from '../../src/runtimeHelpers'
|
||||
import { transformElement } from '../../src/transforms/transformElement'
|
||||
|
|
@ -378,36 +377,6 @@ describe('compiler: hoistStatic transform', () => {
|
|||
expect(generate(root).code).toMatchSnapshot()
|
||||
})
|
||||
|
||||
test('hoist static text node between elements', () => {
|
||||
const root = transformWithHoist(`<div>static<div>static</div></div>`)
|
||||
expect(root.hoists).toMatchObject([
|
||||
{
|
||||
callee: CREATE_TEXT,
|
||||
arguments: [
|
||||
{
|
||||
type: NodeTypes.TEXT,
|
||||
content: `static`
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: NodeTypes.VNODE_CALL,
|
||||
tag: `"div"`
|
||||
},
|
||||
{
|
||||
type: NodeTypes.JS_ARRAY_EXPRESSION,
|
||||
elements: [
|
||||
{
|
||||
type: NodeTypes.TEXT_CALL
|
||||
},
|
||||
{
|
||||
type: NodeTypes.ELEMENT
|
||||
}
|
||||
]
|
||||
}
|
||||
])
|
||||
})
|
||||
|
||||
describe('prefixIdentifiers', () => {
|
||||
test('hoist nested static tree with static interpolation', () => {
|
||||
const root = transformWithHoist(
|
||||
|
|
@ -618,7 +587,9 @@ describe('compiler: hoistStatic transform', () => {
|
|||
})
|
||||
|
||||
test('should NOT hoist SVG with directives', () => {
|
||||
const root = transformWithHoist(`<div><svg v-foo><path d="M2,3H5.5L12"/></svg></div>`)
|
||||
const root = transformWithHoist(
|
||||
`<div><svg v-foo><path d="M2,3H5.5L12"/></svg></div>`
|
||||
)
|
||||
expect(root.hoists.length).toBe(2)
|
||||
expect(generate(root).code).toMatchSnapshot()
|
||||
})
|
||||
|
|
|
|||
|
|
@ -97,12 +97,6 @@ function walk(
|
|||
}
|
||||
}
|
||||
}
|
||||
} else if (
|
||||
child.type === NodeTypes.TEXT_CALL &&
|
||||
getConstantType(child.content, context) >= ConstantTypes.CAN_HOIST
|
||||
) {
|
||||
child.codegenNode = context.hoist(child.codegenNode)
|
||||
hoistedCount++
|
||||
}
|
||||
|
||||
// walk further
|
||||
|
|
|
|||
|
|
@ -737,7 +737,10 @@ export function normalizeVNode(child: VNodeChild): VNode {
|
|||
|
||||
// optimized normalization for template-compiled render fns
|
||||
export function cloneIfMounted(child: VNode): VNode {
|
||||
return child.el === null || child.memo ? child : cloneVNode(child)
|
||||
return (child.el === null && child.patchFlag !== PatchFlags.HOISTED) ||
|
||||
child.memo
|
||||
? child
|
||||
: cloneVNode(child)
|
||||
}
|
||||
|
||||
export function normalizeChildren(vnode: VNode, children: unknown) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue