d023e073503e8060f94b61fc42de3ab35d5cebd73593784d1f8d0a3a03443b384dff7c6a5c68e177e75c3d9d4c0394c480b932fab6a83c1bfc7afa3230431f 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /* @flow */
  2. import { enter, leave } from '../modules/transition'
  3. // recursively search for possible transition defined inside the component root
  4. function locateNode (vnode: VNode): VNodeWithData {
  5. return vnode.componentInstance && (!vnode.data || !vnode.data.transition)
  6. ? locateNode(vnode.componentInstance._vnode)
  7. : vnode
  8. }
  9. export default {
  10. bind (el: any, { value }: VNodeDirective, vnode: VNodeWithData) {
  11. vnode = locateNode(vnode)
  12. const transition = vnode.data && vnode.data.transition
  13. const originalDisplay = el.__vOriginalDisplay =
  14. el.style.display === 'none' ? '' : el.style.display
  15. if (value && transition) {
  16. vnode.data.show = true
  17. enter(vnode, () => {
  18. el.style.display = originalDisplay
  19. })
  20. } else {
  21. el.style.display = value ? originalDisplay : 'none'
  22. }
  23. },
  24. update (el: any, { value, oldValue }: VNodeDirective, vnode: VNodeWithData) {
  25. /* istanbul ignore if */
  26. if (!value === !oldValue) return
  27. vnode = locateNode(vnode)
  28. const transition = vnode.data && vnode.data.transition
  29. if (transition) {
  30. vnode.data.show = true
  31. if (value) {
  32. enter(vnode, () => {
  33. el.style.display = el.__vOriginalDisplay
  34. })
  35. } else {
  36. leave(vnode, () => {
  37. el.style.display = 'none'
  38. })
  39. }
  40. } else {
  41. el.style.display = value ? el.__vOriginalDisplay : 'none'
  42. }
  43. },
  44. unbind (
  45. el: any,
  46. binding: VNodeDirective,
  47. vnode: VNodeWithData,
  48. oldVnode: VNodeWithData,
  49. isDestroy: boolean
  50. ) {
  51. if (!isDestroy) {
  52. el.style.display = el.__vOriginalDisplay
  53. }
  54. }
  55. }