Skip to content

Commit c1cebf6

Browse files
fix: 🐛 修复transitiont打开后立即关闭时无法关闭的问题
1 parent a8dfe57 commit c1cebf6

File tree

1 file changed

+38
-26
lines changed

1 file changed

+38
-26
lines changed

src/uni_modules/wot-design-uni/components/wd-transition/wd-transition.vue

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ const transitionEnded = ref<boolean>(false)
9292
const currentDuration = ref<number>(300)
9393
// 类名
9494
const classes = ref<string>('')
95+
// 用于控制enter和leave的顺序执行
96+
const enterPromise = ref<Promise<void> | null>(null)
9597
9698
const emit = defineEmits(['click', 'before-enter', 'enter', 'before-leave', 'leave', 'after-leave', 'after-enter'])
9799
@@ -128,41 +130,51 @@ function observerShow(value: boolean) {
128130
}
129131
130132
function enter() {
131-
const classNames = getClassNames(props.name)
132-
const duration = isObj(props.duration) ? (props.duration as any).enter : props.duration
133-
status.value = 'enter'
134-
emit('before-enter')
135-
136-
requestAnimationFrame(() => {
137-
emit('enter')
138-
classes.value = classNames.enter
139-
currentDuration.value = duration
133+
if (enterPromise.value) return
134+
enterPromise.value = new Promise((resolve) => {
135+
const classNames = getClassNames(props.name)
136+
const duration = isObj(props.duration) ? (props.duration as any).enter : props.duration
137+
status.value = 'enter'
138+
emit('before-enter')
139+
140140
requestAnimationFrame(() => {
141-
inited.value = true
142-
display.value = true
141+
emit('enter')
142+
classes.value = classNames.enter
143+
currentDuration.value = duration
143144
requestAnimationFrame(() => {
144-
transitionEnded.value = false
145-
classes.value = classNames['enter-to']
145+
inited.value = true
146+
display.value = true
147+
requestAnimationFrame(() => {
148+
transitionEnded.value = false
149+
classes.value = classNames['enter-to']
150+
resolve()
151+
})
146152
})
147153
})
148154
})
149155
}
150156
function leave() {
151-
if (!display.value) return
152-
const classNames = getClassNames(props.name)
153-
const duration = isObj(props.duration) ? (props.duration as any).leave : props.duration
154-
status.value = 'leave'
155-
emit('before-leave')
156-
157-
requestAnimationFrame(() => {
158-
emit('leave')
159-
classes.value = classNames.leave
160-
currentDuration.value = duration
157+
if (!enterPromise.value) return
158+
enterPromise.value.then(() => {
159+
if (!display.value) return
160+
const classNames = getClassNames(props.name)
161+
const duration = isObj(props.duration) ? (props.duration as any).leave : props.duration
162+
status.value = 'leave'
163+
emit('before-leave')
161164
162165
requestAnimationFrame(() => {
163-
transitionEnded.value = false
164-
setTimeout(() => onTransitionEnd(), currentDuration.value)
165-
classes.value = classNames['leave-to']
166+
emit('leave')
167+
classes.value = classNames.leave
168+
currentDuration.value = duration
169+
170+
requestAnimationFrame(() => {
171+
transitionEnded.value = false
172+
setTimeout(() => {
173+
onTransitionEnd()
174+
enterPromise.value = null
175+
}, currentDuration.value)
176+
classes.value = classNames['leave-to']
177+
})
166178
})
167179
})
168180
}

0 commit comments

Comments
 (0)