mirror of https://github.com/vuejs/core.git
fix(runtime-core): Suspense get anchor properly in Transition (#9309)
close #8105
This commit is contained in:
parent
f12db7fb56
commit
65f3fe2731
|
@ -504,7 +504,12 @@ function createSuspenseBoundary(
|
||||||
if (delayEnter) {
|
if (delayEnter) {
|
||||||
activeBranch!.transition!.afterLeave = () => {
|
activeBranch!.transition!.afterLeave = () => {
|
||||||
if (pendingId === suspense.pendingId) {
|
if (pendingId === suspense.pendingId) {
|
||||||
move(pendingBranch!, container, anchor, MoveType.ENTER)
|
move(
|
||||||
|
pendingBranch!,
|
||||||
|
container,
|
||||||
|
next(activeBranch!),
|
||||||
|
MoveType.ENTER
|
||||||
|
)
|
||||||
queuePostFlushCb(effects)
|
queuePostFlushCb(effects)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -577,7 +582,6 @@ function createSuspenseBoundary(
|
||||||
// invoke @fallback event
|
// invoke @fallback event
|
||||||
triggerEvent(vnode, 'onFallback')
|
triggerEvent(vnode, 'onFallback')
|
||||||
|
|
||||||
const anchor = next(activeBranch!)
|
|
||||||
const mountFallback = () => {
|
const mountFallback = () => {
|
||||||
if (!suspense.isInFallback) {
|
if (!suspense.isInFallback) {
|
||||||
return
|
return
|
||||||
|
@ -587,7 +591,7 @@ function createSuspenseBoundary(
|
||||||
null,
|
null,
|
||||||
fallbackVNode,
|
fallbackVNode,
|
||||||
container,
|
container,
|
||||||
anchor,
|
next(activeBranch!),
|
||||||
parentComponent,
|
parentComponent,
|
||||||
null, // fallback tree will not have suspense context
|
null, // fallback tree will not have suspense context
|
||||||
isSVG,
|
isSVG,
|
||||||
|
|
|
@ -1586,6 +1586,72 @@ describe('e2e: Transition', () => {
|
||||||
expect(barMountSpy).toBeCalledTimes(1)
|
expect(barMountSpy).toBeCalledTimes(1)
|
||||||
expect(barMountSpy).toHaveBeenNthCalledWith(1, true, false, true)
|
expect(barMountSpy).toHaveBeenNthCalledWith(1, true, false, true)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// #8105
|
||||||
|
test(
|
||||||
|
'trigger again when transition is not finished',
|
||||||
|
async () => {
|
||||||
|
await page().evaluate(duration => {
|
||||||
|
const { createApp, shallowRef, h } = (window as any).Vue
|
||||||
|
const One = {
|
||||||
|
async setup() {
|
||||||
|
return () => h('div', { class: 'test' }, 'one')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const Two = {
|
||||||
|
async setup() {
|
||||||
|
return () => h('div', { class: 'test' }, 'two')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
createApp({
|
||||||
|
template: `
|
||||||
|
<div id="container">
|
||||||
|
<transition name="test" mode="out-in" duration="${duration}">
|
||||||
|
<Suspense>
|
||||||
|
<component :is="view"/>
|
||||||
|
</Suspense>
|
||||||
|
</transition>
|
||||||
|
</div>
|
||||||
|
<button id="toggleBtn" @click="click">button</button>
|
||||||
|
`,
|
||||||
|
setup: () => {
|
||||||
|
const view = shallowRef(One)
|
||||||
|
const click = () => {
|
||||||
|
view.value = view.value === One ? Two : One
|
||||||
|
}
|
||||||
|
return { view, click }
|
||||||
|
}
|
||||||
|
}).mount('#app')
|
||||||
|
}, duration)
|
||||||
|
|
||||||
|
await nextFrame()
|
||||||
|
expect(await html('#container')).toBe(
|
||||||
|
'<div class="test test-enter-active test-enter-to">one</div>'
|
||||||
|
)
|
||||||
|
|
||||||
|
await transitionFinish()
|
||||||
|
expect(await html('#container')).toBe('<div class="test">one</div>')
|
||||||
|
|
||||||
|
// trigger twice
|
||||||
|
classWhenTransitionStart()
|
||||||
|
classWhenTransitionStart()
|
||||||
|
await nextFrame()
|
||||||
|
expect(await html('#container')).toBe(
|
||||||
|
'<div class="test test-leave-active test-leave-to">one</div>'
|
||||||
|
)
|
||||||
|
|
||||||
|
await transitionFinish()
|
||||||
|
await nextFrame()
|
||||||
|
expect(await html('#container')).toBe(
|
||||||
|
'<div class="test test-enter-active test-enter-to">one</div>'
|
||||||
|
)
|
||||||
|
|
||||||
|
await transitionFinish()
|
||||||
|
await nextFrame()
|
||||||
|
expect(await html('#container')).toBe('<div class="test">one</div>')
|
||||||
|
},
|
||||||
|
E2E_TIMEOUT
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('transition with v-show', () => {
|
describe('transition with v-show', () => {
|
||||||
|
|
Loading…
Reference in New Issue