Skip to content

Commit 43fabd5

Browse files
committed
pass the context vm in transition hooks
1 parent 0800fbe commit 43fabd5

File tree

2 files changed

+45
-37
lines changed

2 files changed

+45
-37
lines changed

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export function nextFrame (fn: Function) {
3737

3838
export function enter (vnode: VNodeWithData) {
3939
const el: any = vnode.elm
40+
const vm = vnode.context
4041
// call leave callback now
4142
if (el._leaveCb) {
4243
el._leaveCb.cancelled = true
@@ -78,7 +79,7 @@ export function enter (vnode: VNodeWithData) {
7879
const enterCancelledHook = isAppear ? (appearCancelled || enterCancelled) : enterCancelled
7980

8081
const expectsCSS = css !== false
81-
const userWantsControl = enterHook && enterHook.length > 1
82+
const userWantsControl = enterHook && enterHook.length > 2
8283
const cb = el._enterCb = once(() => {
8384
if (expectsCSS) {
8485
removeTransitionClass(el, activeClass)
@@ -87,14 +88,14 @@ export function enter (vnode: VNodeWithData) {
8788
if (expectsCSS) {
8889
removeTransitionClass(el, startClass)
8990
}
90-
enterCancelledHook && enterCancelledHook(el)
91+
enterCancelledHook && enterCancelledHook(el, vm)
9192
} else {
92-
afterEnterHook && afterEnterHook(el)
93+
afterEnterHook && afterEnterHook(el, vm)
9394
}
9495
el._enterCb = null
9596
})
9697

97-
beforeEnterHook && beforeEnterHook(el)
98+
beforeEnterHook && beforeEnterHook(el, vm)
9899
if (expectsCSS) {
99100
addTransitionClass(el, startClass)
100101
addTransitionClass(el, activeClass)
@@ -105,14 +106,15 @@ export function enter (vnode: VNodeWithData) {
105106
}
106107
})
107108
}
108-
enterHook && enterHook(el, cb)
109+
enterHook && enterHook(el, vm, cb)
109110
if (!expectsCSS && !userWantsControl) {
110111
cb()
111112
}
112113
}
113114

114115
export function leave (vnode: VNodeWithData, rm: Function) {
115116
const el: any = vnode.elm
117+
const vm = vnode.context
116118
// call enter callback now
117119
if (el._enterCb) {
118120
el._enterCb.cancelled = true
@@ -135,7 +137,7 @@ export function leave (vnode: VNodeWithData, rm: Function) {
135137
} = resolveTransition(data, vnode.context)
136138

137139
const expectsCSS = css !== false
138-
const userWantsControl = onLeave && onLeave.length > 1
140+
const userWantsControl = onLeave && onLeave.length > 2
139141
const cb = el._leaveCb = once(() => {
140142
if (expectsCSS) {
141143
removeTransitionClass(el, leaveActiveClass)
@@ -144,10 +146,10 @@ export function leave (vnode: VNodeWithData, rm: Function) {
144146
if (expectsCSS) {
145147
removeTransitionClass(el, leaveClass)
146148
}
147-
leaveCancelled && leaveCancelled(el)
149+
leaveCancelled && leaveCancelled(el, vm)
148150
} else {
149151
rm()
150-
afterLeave && afterLeave(el)
152+
afterLeave && afterLeave(el, vm)
151153
}
152154
el._leaveCb = null
153155
})
@@ -159,7 +161,7 @@ export function leave (vnode: VNodeWithData, rm: Function) {
159161
}
160162

161163
function performLeave () {
162-
beforeLeave && beforeLeave(el)
164+
beforeLeave && beforeLeave(el, vm)
163165
if (expectsCSS) {
164166
addTransitionClass(el, leaveClass)
165167
addTransitionClass(el, leaveActiveClass)
@@ -170,7 +172,7 @@ export function leave (vnode: VNodeWithData, rm: Function) {
170172
}
171173
})
172174
}
173-
onLeave && onLeave(el, cb)
175+
onLeave && onLeave(el, vm, cb)
174176
if (!expectsCSS && !userWantsControl) {
175177
cb()
176178
}

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

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -167,56 +167,62 @@ if (!isIE9) {
167167
})
168168

169169
it('transition with JavaScript hooks', done => {
170+
const onLeaveSpy = jasmine.createSpy('onLeave')
171+
const onEnterSpy = jasmine.createSpy('onEnter')
170172
const beforeLeaveSpy = jasmine.createSpy('beforeLeave')
171173
const beforeEnterSpy = jasmine.createSpy('beforeEnter')
172-
const hooks = {
173-
beforeLeave: el => {
174-
expect(el).toBe(vm.$el.children[0])
175-
expect(el.className).toBe('test')
176-
beforeLeaveSpy()
177-
},
178-
onLeave: jasmine.createSpy('leave'),
179-
afterLeave: jasmine.createSpy('afterLeave'),
180-
beforeEnter: el => {
181-
expect(vm.$el.contains(el)).toBe(false)
182-
expect(el.className).toBe('test')
183-
beforeEnterSpy()
184-
},
185-
onEnter: jasmine.createSpy('enter'),
186-
afterEnter: jasmine.createSpy('afterEnter')
187-
}
174+
const afterLeaveSpy = jasmine.createSpy('afterLeave')
175+
const afterEnterSpy = jasmine.createSpy('afterEnter')
188176

189177
const vm = new Vue({
190178
template: '<div><div v-if="ok" class="test" transition="test">foo</div></div>',
191179
data: { ok: true },
192180
transitions: {
193-
test: hooks
181+
test: {
182+
beforeLeave: (el, vm) => {
183+
expect(el).toBe(vm.$el.children[0])
184+
expect(el.className).toBe('test')
185+
beforeLeaveSpy(el, vm)
186+
},
187+
onLeave: (el, vm) => onLeaveSpy(el, vm),
188+
afterLeave: (el, vm) => afterLeaveSpy(el, vm),
189+
beforeEnter: (el, vm) => {
190+
expect(vm.$el.contains(el)).toBe(false)
191+
expect(el.className).toBe('test')
192+
beforeEnterSpy(el, vm)
193+
},
194+
onEnter: (el, vm) => onEnterSpy(el, vm),
195+
afterEnter: (el, vm) => afterEnterSpy(el, vm)
196+
}
194197
}
195198
}).$mount(el)
196199

197200
// should not apply transition on initial render by default
198201
expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
202+
203+
let _el = vm.$el.children[0]
199204
vm.ok = false
200205
waitForUpdate(() => {
201-
expect(beforeLeaveSpy).toHaveBeenCalled()
202-
expect(hooks.onLeave).toHaveBeenCalled()
206+
expect(beforeLeaveSpy).toHaveBeenCalledWith(_el, vm)
207+
expect(onLeaveSpy).toHaveBeenCalledWith(_el, vm)
203208
expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
204209
}).thenWaitFor(nextFrame).then(() => {
205-
expect(hooks.afterLeave).not.toHaveBeenCalled()
210+
expect(afterLeaveSpy).not.toHaveBeenCalled()
206211
expect(vm.$el.children[0].className).toBe('test test-leave-active')
207212
}).thenWaitFor(duration + 10).then(() => {
208-
expect(hooks.afterLeave).toHaveBeenCalled()
213+
expect(afterLeaveSpy).toHaveBeenCalledWith(_el, vm)
209214
expect(vm.$el.children.length).toBe(0)
210215
vm.ok = true
211216
}).then(() => {
212-
expect(beforeEnterSpy).toHaveBeenCalled()
213-
expect(hooks.onEnter).toHaveBeenCalled()
217+
_el = vm.$el.children[0]
218+
expect(beforeEnterSpy).toHaveBeenCalledWith(_el, vm)
219+
expect(onEnterSpy).toHaveBeenCalledWith(_el, vm)
214220
expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
215221
}).thenWaitFor(nextFrame).then(() => {
216-
expect(hooks.afterEnter).not.toHaveBeenCalled()
222+
expect(afterEnterSpy).not.toHaveBeenCalled()
217223
expect(vm.$el.children[0].className).toBe('test test-enter-active')
218224
}).thenWaitFor(duration + 10).then(() => {
219-
expect(hooks.afterEnter).toHaveBeenCalled()
225+
expect(afterEnterSpy).toHaveBeenCalledWith(_el, vm)
220226
expect(vm.$el.children[0].className).toBe('test')
221227
}).then(done)
222228
})
@@ -228,10 +234,10 @@ if (!isIE9) {
228234
data: { ok: true },
229235
transitions: {
230236
test: {
231-
onEnter: (el, cb) => {
237+
onEnter: (el, vm, cb) => {
232238
next = cb
233239
},
234-
onLeave: (el, cb) => {
240+
onLeave: (el, vm, cb) => {
235241
next = cb
236242
}
237243
}

0 commit comments

Comments
 (0)