Skip to content

Commit 68a73cf

Browse files
committed
support dynamic refs
1 parent c949c74 commit 68a73cf

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

src/core/vdom/modules/ref.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@ import { remove } from 'shared/util'
44

55
export default {
66
create (_, vnode) {
7-
registerRef(vnode, false)
7+
registerRef(vnode)
8+
},
9+
update (oldVnode, vnode) {
10+
if (oldVnode.data.ref !== vnode.data.ref) {
11+
registerRef(oldVnode, true)
12+
registerRef(vnode)
13+
}
814
},
915
destroy (vnode) {
1016
registerRef(vnode, true)
1117
}
1218
}
1319

14-
function registerRef (vnode: VNodeWithData, isRemoval: boolean) {
20+
function registerRef (vnode: VNodeWithData, isRemoval: ?boolean) {
1521
const key = vnode.data.ref
1622
if (!key) return
1723

test/unit/features/ref.spec.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,21 @@ describe('ref', () => {
2828
expect(vm.$refs.bar.$options.id).toBe('test2')
2929
})
3030

31+
it('should dynamically update refs', done => {
32+
const vm = new Vue({
33+
data: {
34+
value: 'foo'
35+
},
36+
template: '<div :ref="value"></div>'
37+
}).$mount()
38+
expect(vm.$refs.foo).toBe(vm.$el)
39+
vm.value = 'bar'
40+
waitForUpdate(() => {
41+
expect(vm.$refs.foo).toBeUndefined()
42+
expect(vm.$refs.bar).toBe(vm.$el)
43+
}).then(done)
44+
})
45+
3146
it('should work as a hyperscript prop', () => {
3247
const vm = new Vue({
3348
components,

0 commit comments

Comments
 (0)