fix: 🐛 修复transitiont打开后立即关闭时无法关闭的问题

This commit is contained in:
weisheng 2024-03-09 23:45:48 +08:00
parent a8dfe5752f
commit c1cebf6de0

View File

@ -92,6 +92,8 @@ const transitionEnded = ref<boolean>(false)
const currentDuration = ref<number>(300) const currentDuration = ref<number>(300)
// //
const classes = ref<string>('') const classes = ref<string>('')
// enterleave
const enterPromise = ref<Promise<void> | null>(null)
const emit = defineEmits(['click', 'before-enter', 'enter', 'before-leave', 'leave', 'after-leave', 'after-enter']) const emit = defineEmits(['click', 'before-enter', 'enter', 'before-leave', 'leave', 'after-leave', 'after-enter'])
@ -128,41 +130,51 @@ function observerShow(value: boolean) {
} }
function enter() { function enter() {
const classNames = getClassNames(props.name) if (enterPromise.value) return
const duration = isObj(props.duration) ? (props.duration as any).enter : props.duration enterPromise.value = new Promise((resolve) => {
status.value = 'enter' const classNames = getClassNames(props.name)
emit('before-enter') const duration = isObj(props.duration) ? (props.duration as any).enter : props.duration
status.value = 'enter'
emit('before-enter')
requestAnimationFrame(() => {
emit('enter')
classes.value = classNames.enter
currentDuration.value = duration
requestAnimationFrame(() => { requestAnimationFrame(() => {
inited.value = true emit('enter')
display.value = true classes.value = classNames.enter
currentDuration.value = duration
requestAnimationFrame(() => { requestAnimationFrame(() => {
transitionEnded.value = false inited.value = true
classes.value = classNames['enter-to'] display.value = true
requestAnimationFrame(() => {
transitionEnded.value = false
classes.value = classNames['enter-to']
resolve()
})
}) })
}) })
}) })
} }
function leave() { function leave() {
if (!display.value) return if (!enterPromise.value) return
const classNames = getClassNames(props.name) enterPromise.value.then(() => {
const duration = isObj(props.duration) ? (props.duration as any).leave : props.duration if (!display.value) return
status.value = 'leave' const classNames = getClassNames(props.name)
emit('before-leave') const duration = isObj(props.duration) ? (props.duration as any).leave : props.duration
status.value = 'leave'
requestAnimationFrame(() => { emit('before-leave')
emit('leave')
classes.value = classNames.leave
currentDuration.value = duration
requestAnimationFrame(() => { requestAnimationFrame(() => {
transitionEnded.value = false emit('leave')
setTimeout(() => onTransitionEnd(), currentDuration.value) classes.value = classNames.leave
classes.value = classNames['leave-to'] currentDuration.value = duration
requestAnimationFrame(() => {
transitionEnded.value = false
setTimeout(() => {
onTransitionEnd()
enterPromise.value = null
}, currentDuration.value)
classes.value = classNames['leave-to']
})
}) })
}) })
} }