UNPKG

1.05 kBJavaScriptView Raw
1/* @flow */
2
3import { remove, isDef } from 'shared/util'
4
5export default {
6 create (_: any, vnode: VNodeWithData) {
7 registerRef(vnode)
8 },
9 update (oldVnode: VNodeWithData, vnode: VNodeWithData) {
10 if (oldVnode.data.ref !== vnode.data.ref) {
11 registerRef(oldVnode, true)
12 registerRef(vnode)
13 }
14 },
15 destroy (vnode: VNodeWithData) {
16 registerRef(vnode, true)
17 }
18}
19
20export function registerRef (vnode: VNodeWithData, isRemoval: ?boolean) {
21 const key = vnode.data.ref
22 if (!isDef(key)) return
23
24 const vm = vnode.context
25 const ref = vnode.componentInstance || vnode.elm
26 const refs = vm.$refs
27 if (isRemoval) {
28 if (Array.isArray(refs[key])) {
29 remove(refs[key], ref)
30 } else if (refs[key] === ref) {
31 refs[key] = undefined
32 }
33 } else {
34 if (vnode.data.refInFor) {
35 if (!Array.isArray(refs[key])) {
36 refs[key] = [ref]
37 } else if (refs[key].indexOf(ref) < 0) {
38 // $flow-disable-line
39 refs[key].push(ref)
40 }
41 } else {
42 refs[key] = ref
43 }
44 }
45}