@before-enter hook returns a Promise?@before-enter hook returns a Promise, how does Vue handle the transition?<template>
<transition
@before-enter="beforeEnter"
@enter="enter"
@leave="leave"
>
<div v-if="show">Hello</div>
</transition>
</template>
<script setup>
import { ref } from 'vue'
const show = ref(true)
function beforeEnter(el) {
return new Promise(resolve => {
setTimeout(() => {
el.style.opacity = '0'
resolve()
}, 100)
})
}
function enter(el, done) {
el.style.transition = 'opacity 0.5s'
el.style.opacity = '1'
setTimeout(done, 500)
}
function leave(el, done) {
el.style.transition = 'opacity 0.5s'
el.style.opacity = '0'
setTimeout(done, 500)
}
</script>Vue waits for the Promise returned by @before-enter to resolve before starting the enter transition. This allows asynchronous setup before the animation begins.
@enter hook with a done callback?@enter hook that uses the done callback to signal transition end.The @enter hook receives the element as the first argument and the done callback as the second. Calling done() signals the end of the transition.
<template> <transition @leave="leave"> <div v-if="show">Bye</div> </transition> </template> <script setup> import { ref } from 'vue' const show = ref(true) function leave(el, done) { el.style.transition = 'opacity 1s' el.style.opacity = '0' // done() is never called } </script>
Vue waits for the done() callback to be called to know when the leave transition finishes. If it is never called, Vue waits forever.
@after-leave hook in Vue transitions?@after-leave hook does.The @after-leave hook runs after the leave transition completes and the element is removed from the DOM. It is useful for cleanup.
<template> <transition @enter="enter"> <div v-if="show">Fade In</div> </transition> </template> <script setup> import { ref } from 'vue' const show = ref(true) function enter(el, done) { el.style.opacity = '0' el.style.transition = 'opacity 0.3s ease-in' requestAnimationFrame(() => { el.style.opacity = '1' }) setTimeout(() => { done() }, 300) } </script>
The element starts with opacity 0, then transitions to opacity 1 over 0.3 seconds. After the transition, opacity remains 1.
