Skip to content

Commit 612d321

Browse files
committed
fix transition v-show display toggle timing for enter hooks (fix vuejs#4418)
1 parent 0163a6f commit 612d321

File tree

3 files changed

+29
-10
lines changed

3 files changed

+29
-10
lines changed

src/platforms/web/runtime/directives/show.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,28 @@ export default {
1414
bind (el: any, { value }: VNodeDirective, vnode: VNodeWithData) {
1515
vnode = locateNode(vnode)
1616
const transition = vnode.data && vnode.data.transition
17+
const originalDisplay = el.__vOriginalDisplay =
18+
el.style.display === 'none' ? '' : el.style.display
1719
if (value && transition && !isIE9) {
18-
enter(vnode)
20+
vnode.data.show = true
21+
enter(vnode, () => {
22+
el.style.display = originalDisplay
23+
})
24+
} else {
25+
el.style.display = value ? originalDisplay : 'none'
1926
}
20-
const originalDisplay = el.style.display === 'none' ? '' : el.style.display
21-
el.style.display = value ? originalDisplay : 'none'
22-
el.__vOriginalDisplay = originalDisplay
2327
},
2428
update (el: any, { value, oldValue }: VNodeDirective, vnode: VNodeWithData) {
2529
/* istanbul ignore if */
2630
if (value === oldValue) return
2731
vnode = locateNode(vnode)
2832
const transition = vnode.data && vnode.data.transition
2933
if (transition && !isIE9) {
34+
vnode.data.show = true
3035
if (value) {
31-
enter(vnode)
32-
el.style.display = el.__vOriginalDisplay
36+
enter(vnode, () => {
37+
el.style.display = el.__vOriginalDisplay
38+
})
3339
} else {
3440
leave(vnode, () => {
3541
el.style.display = 'none'

src/platforms/web/runtime/modules/transition.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
whenTransitionEnds
1212
} from '../transition-util'
1313

14-
export function enter (vnode: VNodeWithData) {
14+
export function enter (vnode: VNodeWithData, toggleDisplay: ?() => void) {
1515
const el: any = vnode.elm
1616

1717
// call leave callback now
@@ -122,6 +122,7 @@ export function enter (vnode: VNodeWithData) {
122122
}
123123

124124
if (vnode.data.show) {
125+
toggleDisplay && toggleDisplay()
125126
enterHook && enterHook(el, cb)
126127
}
127128

test/unit/features/transition/transition.spec.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,20 +279,32 @@ if (!isIE9) {
279279
data: { ok: true },
280280
methods: {
281281
beforeLeave: (el) => {
282+
expect(el.style.display).toBe('')
282283
expect(el).toBe(vm.$el.children[0])
283284
expect(el.className).toBe('test')
284285
beforeLeaveSpy(el)
285286
},
286-
leave: (el) => onLeaveSpy(el),
287-
afterLeave: (el) => afterLeaveSpy(el),
287+
leave: (el) => {
288+
expect(el.style.display).toBe('')
289+
onLeaveSpy(el)
290+
},
291+
afterLeave: (el) => {
292+
expect(el.style.display).toBe('none')
293+
afterLeaveSpy(el)
294+
},
288295
beforeEnter: (el) => {
289296
expect(el.className).toBe('test')
297+
expect(el.style.display).toBe('none')
290298
beforeEnterSpy(el)
291299
},
292300
enter: (el) => {
301+
expect(el.style.display).toBe('')
293302
onEnterSpy(el)
294303
},
295-
afterEnter: (el) => afterEnterSpy(el)
304+
afterEnter: (el) => {
305+
expect(el.style.display).toBe('')
306+
afterEnterSpy(el)
307+
}
296308
}
297309
}).$mount(el)
298310

0 commit comments

Comments
 (0)