mirror of
https://gitee.com/wot-design-uni/wot-design-uni.git
synced 2025-12-08 01:58:52 +08:00
fix: 🐛 修复transitiont打开后立即关闭时无法关闭的问题
This commit is contained in:
parent
a8dfe5752f
commit
c1cebf6de0
@ -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>('')
|
||||||
|
// 用于控制enter和leave的顺序执行
|
||||||
|
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']
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user