This commit is contained in:
yangxiuxiu 2025-05-05 20:38:28 +00:00 committed by GitHub
commit f8558a3c76
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 58 additions and 12 deletions

View File

@ -1198,4 +1198,54 @@ describe('BaseTransition', () => {
test('should not error on KeepAlive w/ function children', () => {
expect(() => mount({}, () => () => h('div'), true)).not.toThrow()
})
// #12091
test('ensure the correct order of hook execution during the mounted phase toggle', async () => {
const toggle = ref(false)
const visible = ref(true)
const hooks: string[] = []
const Home = {
setup() {
return () =>
h(
BaseTransition,
{
appear: true,
onBeforeEnter: () => hooks.push('beforeEnter'),
onEnter: (el, done) => hooks.push('enter'),
onEnterCancelled: () => hooks.push('enterCancelled'),
onAfterEnter: () => hooks.push('afterEnter'),
onBeforeLeave: () => hooks.push('beforeLeave'),
onLeave: () => hooks.push('leave'),
},
() => (visible.value ? h('div') : null),
)
},
}
const About = {
setup() {
visible.value = false
return () => null
},
}
const root = nodeOps.createElement('div')
const App = {
setup() {
return () => (toggle.value ? [h(Home), h(About)] : null)
},
}
render(h(App), root)
setTimeout(async () => {
toggle.value = true
await nextTick()
expect(hooks.join('-')).eq(
`beforeEnter-enter-enterCancelled-beforeLeave-leave`,
)
})
})
})

View File

@ -532,14 +532,12 @@ export function createHydrationFunctions(
if (dirs) {
invokeDirectiveHook(vnode, null, parentComponent, 'beforeMount')
}
if (
(vnodeHooks = props && props.onVnodeMounted) ||
dirs ||
needCallTransitionHooks
) {
if (needCallTransitionHooks) {
transition!.enter(el)
}
if ((vnodeHooks = props && props.onVnodeMounted) || dirs) {
queueEffectWithSuspense(() => {
vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode)
needCallTransitionHooks && transition!.enter(el)
dirs && invokeDirectiveHook(vnode, null, parentComponent, 'mounted')
}, parentSuspense)
}

View File

@ -712,14 +712,12 @@ function baseCreateRenderer(
transition!.beforeEnter(el)
}
hostInsert(el, container, anchor)
if (
(vnodeHook = props && props.onVnodeMounted) ||
needCallTransitionHooks ||
dirs
) {
if (needCallTransitionHooks) {
transition!.enter(el)
}
if ((vnodeHook = props && props.onVnodeMounted) || dirs) {
queuePostRenderEffect(() => {
vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode)
needCallTransitionHooks && transition!.enter(el)
dirs && invokeDirectiveHook(vnode, null, parentComponent, 'mounted')
}, parentSuspense)
}