@@ -92,6 +92,8 @@ const transitionEnded = ref<boolean>(false)
9292const currentDuration = ref <number >(300 )
9393// 类名
9494const classes = ref <string >(' ' )
95+ // 用于控制enter和leave的顺序执行
96+ const enterPromise = ref <Promise <void > | null >(null )
9597
9698const emit = defineEmits ([' click' , ' before-enter' , ' enter' , ' before-leave' , ' leave' , ' after-leave' , ' after-enter' ])
9799
@@ -128,41 +130,51 @@ function observerShow(value: boolean) {
128130}
129131
130132function 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}
150156function 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