UNPKG

vue

Version:

Reactive, component-oriented view layer for modern web interfaces.

77 lines (70 loc) 1.87 kB
/* @flow */ import { isDef, isUndef, isObject } from 'shared/util' export function genClassForVnode (vnode: VNode): string { let data = vnode.data let parentNode = vnode let childNode = vnode while (isDef(childNode.componentInstance)) { childNode = childNode.componentInstance._vnode if (childNode.data) { data = mergeClassData(childNode.data, data) } } while (isDef(parentNode = parentNode.parent)) { if (parentNode.data) { data = mergeClassData(data, parentNode.data) } } return genClassFromData(data) } 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 } } function genClassFromData (data: Object): string { const dynamicClass = data.class const staticClass = data.staticClass 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 (isUndef(value)) { return '' } if (typeof value === 'string') { return value } let res = '' if (Array.isArray(value)) { let stringified for (let i = 0, l = value.length; i < l; i++) { if (isDef(value[i])) { if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') { res += stringified + ' ' } } } return res.slice(0, -1) } if (isObject(value)) { for (const key in value) { if (value[key]) res += key + ' ' } return res.slice(0, -1) } /* istanbul ignore next */ return res }