Skip to content

Commit d2ee443

Browse files
committed
fix(runtime-dom): fix multi vShow impact each other
close vuejs#10338
1 parent 272ab9f commit d2ee443

File tree

1 file changed

+15
-4
lines changed
  • packages/runtime-dom/src/directives

1 file changed

+15
-4
lines changed

packages/runtime-dom/src/directives/vShow.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ interface VShowElement extends HTMLElement {
77
[vShowOldKey]: string
88
}
99

10+
const resolvedPromise = Promise.resolve()
11+
1012
export const vShow: ObjectDirective<VShowElement> & { name?: 'show' } = {
1113
beforeMount(el, { value }, { transition }) {
1214
el[vShowOldKey] = el.style.display === 'none' ? '' : el.style.display
@@ -24,21 +26,24 @@ export const vShow: ObjectDirective<VShowElement> & { name?: 'show' } = {
2426
updated(el, { value, oldValue }, { transition }) {
2527
if (
2628
!value === !oldValue &&
27-
(el.style.display === el[vShowOldKey] || !value)
29+
(el.style.display === el[vShowOldKey] || (!value && transition))
2830
)
2931
return
3032
if (transition) {
3133
if (value) {
3234
transition.beforeEnter(el)
33-
setDisplay(el, true)
35+
postSetDisplay(el, true)
3436
transition.enter(el)
3537
} else {
3638
transition.leave(el, () => {
37-
setDisplay(el, false)
39+
postSetDisplay(el, false)
3840
})
3941
}
4042
} else {
41-
setDisplay(el, value)
43+
// #10038
44+
// when multi vShow be applied to the same element
45+
// and the sync setDisplay will impact other vShow
46+
postSetDisplay(el, value)
4247
}
4348
},
4449
beforeUnmount(el, { value }) {
@@ -54,6 +59,12 @@ function setDisplay(el: VShowElement, value: unknown): void {
5459
el.style.display = value ? el[vShowOldKey] : 'none'
5560
}
5661

62+
function postSetDisplay(el: VShowElement, value: unknown): void {
63+
resolvedPromise.then(() => {
64+
setDisplay(el, value)
65+
})
66+
}
67+
5768
// SSR vnode transforms, only used when user includes client-oriented render
5869
// function in SSR
5970
export function initVShowForSSR() {

0 commit comments

Comments
 (0)