UNPKG

at-ui

Version:

A UI Component Library with Vue.js

219 lines (182 loc) 5.14 kB
/** * 常用方法 */ const SPECIAL_CHARS_REGEXP = /([:\-_]+(.))/g const MOZ_HACK_REGEXP = /^moz([A-Z])/ const trim = function (string) { return (string || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, '') } /** * [camelCaseToHyphen 将驼峰命名转换为连字符] * @param {[string]} str [驼峰命名的字符串] * @return {[string]} [连字符的字符串] */ export function camelCaseToHyphen (str) { return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase() } export function camelCase (name) { return name.replace(SPECIAL_CHARS_REGEXP, function (_, separator, letter, offset) { return offset ? letter.toUpperCase() : letter }).replace(MOZ_HACK_REGEXP, 'Moz$1') } export function getStyle (element, styleName) { if (!element || !styleName) return null styleName = camelCase(styleName) if (styleName === 'float') { styleName = 'cssFloat' } try { const computed = document.defaultView.getComputedStyle(element, '') return element.style[styleName] || computed ? computed[styleName] : null } catch (e) { return element.style[styleName] } } function typeOf (obj) { const map = { '[object Boolean]': 'boolean', '[object Number]': 'number', '[object String]': 'string', '[object Function]': 'function', '[object Array]': 'array', '[object Date]': 'date', '[object RegExp]': 'regExp', '[object Undefined]': 'undefined', '[object Null]': 'null', '[object Object]': 'object', } return map[Object.prototype.toString.call(obj)] } export function deepCopy (data) { const type = typeOf(data) let obj if (type === 'array') { obj = [] } else if (type === 'object') { obj = {} } else { return data } if (type === 'array') { for (let i = 0; i < data.length; i++) { obj.push(deepCopy(data[i])) } } else if (type === 'object') { for (const i in data) { obj[i] = deepCopy(data[i]) } } return obj } export function hasClass (el, cls) { if (!el || !cls) return false if (cls.indexOf(' ') !== -1) throw new Error('className should not contain space.') if (el.classList) { return el.classList.contains(cls) } return (` ${el.className} `).indexOf(` ${cls} `) > -1 } export function addClass (el, cls) { if (!el) return const classes = (cls || '').split(' ') let curClass = el.className for (let i = 0, j = classes.length; i < j; i++) { const clsName = classes[i] if (!clsName) continue if (el.classList) { el.classList.add(clsName) } else if (!hasClass(el, clsName)) { curClass += ` ${clsName}` } } if (!el.classList) { el.className = curClass } } export function removeClass (el, cls) { if (!el || !cls) return const classes = cls.split(' ') let curClass = ` ${el.className} ` for (let i = 0, j = classes.length; i < j; i++) { const clsName = classes[i] if (!clsName) continue if (el.classList) { el.classList.remove(clsName) } else if (hasClass(el, clsName)) { curClass = curClass.replace(` ${clsName} `, ' ') } } if (!el.classList) { el.className = trim(curClass) } } export function findComponentUpward (context, componentName, componentNames) { if (typeof componentName === 'string') { componentNames = [componentName] } else { componentNames = componentName } let parent = context.$parent let name = parent.$options.name while (parent && (!name || componentNames.indexOf(name) < 0)) { parent = parent.$parent if (parent) name = parent.$options.name } return parent } export function findComponentsUpward (context, componentName, components = []) { let parent = context.$parent let name = parent.$options.name while (parent && name) { if (componentName === name) { components.push(parent) } parent = parent.$parent if (parent) { name = parent.$options.name } } return components } export function findComponentDownward (context, componentName) { const childrens = context.$children let children if (childrens.length) { childrens.forEach(child => { if (child.$options.name === componentName) { children = child } }) for (let i = 0, len = childrens.length; i < len; i++) { const child = childrens[i] const name = child.$options.name if (name === componentName) { children = child break } else { children = findComponentDownward(child, componentName) if (children) break } } } return children } export function findComponentsDownward (context, componentName, components = []) { const childrens = context.$children if (childrens.length) { childrens.forEach(child => { const subChildren = child.$children const name = child.$options.name if (name === componentName) { components.push(child) } if (subChildren.length) { const findChildren = findComponentsDownward(child, componentName, components) if (findChildren) { components.concat(findChildren) } } }) } return components }