4409e5d3f3b6dc4fbce22b7f4b0b0b5846c56cd21e6a45c34b33d910222f5bb09ec5c37cd95d356e291551f1ca4e4035f42817e34fc9c299cd48c847c0fc4e 1.0 KB

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