vue
Version:
Reactive, component-oriented view layer for modern web interfaces.
86 lines (77 loc) • 1.99 kB
JavaScript
/* @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
}