Skip to content

Commit b557d3f

Browse files
authoredJun 14, 2024··
fix(runtime-core): avoid traversing static children for vnodes w/ PatchFlags.BAIL (#11115)
close #10547
1 parent 04729ba commit b557d3f

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed
 

‎packages/runtime-core/__tests__/rendererFragment.spec.ts

+59
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
NodeOpTypes,
44
type TestElement,
55
TestNodeTypes,
6+
type VNode,
67
createBlock,
78
createCommentVNode,
89
createTextVNode,
@@ -316,6 +317,64 @@ describe('renderer: fragment', () => {
316317
)
317318
})
318319

320+
// #10547
321+
test('`template` fragment w/ render function', () => {
322+
const renderFn = (vnode: VNode) => {
323+
return (
324+
openBlock(),
325+
createBlock(
326+
Fragment,
327+
null,
328+
[createTextVNode('text'), (openBlock(), createBlock(vnode))],
329+
PatchFlags.STABLE_FRAGMENT,
330+
)
331+
)
332+
}
333+
334+
const root = nodeOps.createElement('div')
335+
const foo = h('div', ['foo'])
336+
const bar = h('div', [h('div', 'bar')])
337+
338+
render(renderFn(foo), root)
339+
expect(serializeInner(root)).toBe(`text<div>foo</div>`)
340+
341+
render(renderFn(bar), root)
342+
expect(serializeInner(root)).toBe(`text<div><div>bar</div></div>`)
343+
344+
render(renderFn(foo), root)
345+
expect(serializeInner(root)).toBe(`text<div>foo</div>`)
346+
})
347+
348+
// #10547
349+
test('`template` fragment w/ render function + keyed vnode', () => {
350+
const renderFn = (vnode: VNode) => {
351+
return (
352+
openBlock(),
353+
createBlock(
354+
Fragment,
355+
null,
356+
[createTextVNode('text'), (openBlock(), createBlock(vnode))],
357+
PatchFlags.STABLE_FRAGMENT,
358+
)
359+
)
360+
}
361+
362+
const root = nodeOps.createElement('div')
363+
const foo = h('div', { key: 1 }, [h('div', 'foo')])
364+
const bar = h('div', { key: 2 }, [h('div', 'bar'), h('div', 'bar')])
365+
366+
render(renderFn(foo), root)
367+
expect(serializeInner(root)).toBe(`text<div><div>foo</div></div>`)
368+
369+
render(renderFn(bar), root)
370+
expect(serializeInner(root)).toBe(
371+
`text<div><div>bar</div><div>bar</div></div>`,
372+
)
373+
374+
render(renderFn(foo), root)
375+
expect(serializeInner(root)).toBe(`text<div><div>foo</div></div>`)
376+
})
377+
319378
// #6852
320379
test('`template` keyed fragment w/ text', () => {
321380
const root = nodeOps.createElement('div')

‎packages/runtime-core/src/renderer.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -2473,7 +2473,8 @@ export function traverseStaticChildren(n1: VNode, n2: VNode, shallow = false) {
24732473
c2 = ch2[i] = cloneIfMounted(ch2[i] as VNode)
24742474
c2.el = c1.el
24752475
}
2476-
if (!shallow) traverseStaticChildren(c1, c2)
2476+
if (!shallow && c2.patchFlag !== PatchFlags.BAIL)
2477+
traverseStaticChildren(c1, c2)
24772478
}
24782479
// #6852 also inherit for text nodes
24792480
if (c2.type === Text) {

0 commit comments

Comments
 (0)
Please sign in to comment.