Skip to content

Commit

Permalink
fix(suspense): fix dynamicChildren tracking when suspense root is a b…
Browse files Browse the repository at this point in the history
…lock itself

e.g. `<slot>` inside suspense

fix vuejs#4183, fix vuejs#4198
  • Loading branch information
yyx990803 committed Jul 28, 2021
1 parent 1867591 commit 51ee84f
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 2 deletions.
52 changes: 51 additions & 1 deletion packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ import {
SetupContext,
createApp,
FunctionalComponent,
renderList
renderList,
onUnmounted
} from '@vue/runtime-test'
import { PatchFlags, SlotFlags } from '@vue/shared'
import { SuspenseImpl } from '../src/components/Suspense'
Expand Down Expand Up @@ -826,6 +827,55 @@ describe('renderer: optimized mode', () => {
expect(inner(root)).toBe('<div><div>true</div></div>')
})

// #4183
test('should not take unmount children fast path /w Suspense', async () => {
const show = ref(true)
const spyUnmounted = jest.fn()

const Parent = {
setup(props: any, { slots }: SetupContext) {
return () => (
openBlock(),
createBlock(SuspenseImpl, null, {
default: withCtx(() => [renderSlot(slots, 'default')]),
_: SlotFlags.FORWARDED
})
)
}
}

const Child = {
setup() {
onUnmounted(spyUnmounted)
return () => createVNode('div', null, show.value, PatchFlags.TEXT)
}
}

const app = createApp({
render() {
return show.value
? (openBlock(),
createBlock(
Parent,
{ key: 0 },
{
default: withCtx(() => [createVNode(Child)]),
_: SlotFlags.STABLE
}
))
: createCommentVNode('v-if', true)
}
})

app.mount(root)
expect(inner(root)).toBe('<div>true</div>')

show.value = false
await nextTick()
expect(inner(root)).toBe('<!--v-if-->')
expect(spyUnmounted).toHaveBeenCalledTimes(1)
})

// #3881
// root cause: fragment inside a compiled slot passed to component which
// programmatically invokes the slot. The entire slot should de-opt but
Expand Down
2 changes: 1 addition & 1 deletion packages/runtime-core/src/components/Suspense.ts
Original file line number Diff line number Diff line change
Expand Up @@ -749,7 +749,7 @@ function normalizeSuspenseSlot(s: any) {
s = singleChild
}
s = normalizeVNode(s)
if (block) {
if (block && !s.dynamicChildren) {
s.dynamicChildren = block.filter(c => c !== s)
}
return s
Expand Down

0 comments on commit 51ee84f

Please sign in to comment.