52c500b3ab450c36d3cf46c2ae8358315d3ede5c2272869e47424ad3ff9293ac6b0d304869bd8dff50a7ffab1a9b5e28753f5903de2a8012f91770bad25edc 940 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /* @flow */
  2. import { _Set as Set, isObject } from '../util/index'
  3. import type { SimpleSet } from '../util/index'
  4. import VNode from '../vdom/vnode'
  5. const seenObjects = new Set()
  6. /**
  7. * Recursively traverse an object to evoke all converted
  8. * getters, so that every nested property inside the object
  9. * is collected as a "deep" dependency.
  10. */
  11. export function traverse (val: any) {
  12. _traverse(val, seenObjects)
  13. seenObjects.clear()
  14. }
  15. function _traverse (val: any, seen: SimpleSet) {
  16. let i, keys
  17. const isA = Array.isArray(val)
  18. if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {
  19. return
  20. }
  21. if (val.__ob__) {
  22. const depId = val.__ob__.dep.id
  23. if (seen.has(depId)) {
  24. return
  25. }
  26. seen.add(depId)
  27. }
  28. if (isA) {
  29. i = val.length
  30. while (i--) _traverse(val[i], seen)
  31. } else {
  32. keys = Object.keys(val)
  33. i = keys.length
  34. while (i--) _traverse(val[keys[i]], seen)
  35. }
  36. }