Blame view

node_modules/vue/src/platforms/web/util/class.js 1.95 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  /* @flow */
  
  import { isDef, isObject } from 'shared/util'
  
  export function genClassForVnode (vnode: VNodeWithData): string {
    let data = vnode.data
    let parentNode = vnode
    let childNode = vnode
    while (isDef(childNode.componentInstance)) {
      childNode = childNode.componentInstance._vnode
      if (childNode && childNode.data) {
        data = mergeClassData(childNode.data, data)
      }
    }
    while (isDef(parentNode = parentNode.parent)) {
      if (parentNode && parentNode.data) {
        data = mergeClassData(data, parentNode.data)
      }
    }
    return renderClass(data.staticClass, data.class)
  }
  
  function mergeClassData (child: VNodeData, parent: VNodeData): {
    staticClass: string,
    class: any
  } {
    return {
      staticClass: concat(child.staticClass, parent.staticClass),
      class: isDef(child.class)
        ? [child.class, parent.class]
        : parent.class
    }
  }
  
  export function renderClass (
    staticClass: ?string,
    dynamicClass: any
  ): string {
    if (isDef(staticClass) || isDef(dynamicClass)) {
      return concat(staticClass, stringifyClass(dynamicClass))
    }
    /* istanbul ignore next */
    return ''
  }
  
  export function concat (a: ?string, b: ?string): string {
    return a ? b ? (a + ' ' + b) : a : (b || '')
  }
  
  export function stringifyClass (value: any): string {
    if (Array.isArray(value)) {
      return stringifyArray(value)
    }
    if (isObject(value)) {
      return stringifyObject(value)
    }
    if (typeof value === 'string') {
      return value
    }
    /* istanbul ignore next */
    return ''
  }
  
  function stringifyArray (value: Array<any>): string {
    let res = ''
    let stringified
    for (let i = 0, l = value.length; i < l; i++) {
      if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {
        if (res) res += ' '
        res += stringified
      }
    }
    return res
  }
  
  function stringifyObject (value: Object): string {
    let res = ''
    for (const key in value) {
      if (value[key]) {
        if (res) res += ' '
        res += key
      }
    }
    return res
  }