123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- /* @flow */
- import { remove, isDef } from 'shared/util'
- export default {
- create (_: any, vnode: VNodeWithData) {
- registerRef(vnode)
- },
- update (oldVnode: VNodeWithData, vnode: VNodeWithData) {
- if (oldVnode.data.ref !== vnode.data.ref) {
- registerRef(oldVnode, true)
- registerRef(vnode)
- }
- },
- destroy (vnode: VNodeWithData) {
- registerRef(vnode, true)
- }
- }
- export function registerRef (vnode: VNodeWithData, isRemoval: ?boolean) {
- const key = vnode.data.ref
- if (!isDef(key)) return
- const vm = vnode.context
- const ref = vnode.componentInstance || vnode.elm
- const refs = vm.$refs
- if (isRemoval) {
- if (Array.isArray(refs[key])) {
- remove(refs[key], ref)
- } else if (refs[key] === ref) {
- refs[key] = undefined
- }
- } else {
- if (vnode.data.refInFor) {
- if (!Array.isArray(refs[key])) {
- refs[key] = [ref]
- } else if (refs[key].indexOf(ref) < 0) {
- // $flow-disable-line
- refs[key].push(ref)
- }
- } else {
- refs[key] = ref
- }
- }
- }
|