实现classNames方法

29 阅读1分钟

实现classNames方法

/**
 * @param {...(any|Object|Array<any|Object|Array>)} args
 * @return {string}
 */
export default function classNames(...args) {
  const classes = [];
  const processor = (param) => {
    if (param === undefined || param === null) return;
    const type = typeof param;
    if (type === 'boolean') return;
    if (type === 'number') {
      if (param && !isNaN(param)) {
        classes.push(param);
      }
    } else if (type === 'string') {
      if (param) {
        classes.push(param);
      }
    } else if (Array.isArray(param)) {
      param.forEach(processor);
    } else {
      for (const key in param) {
        if (param[key]) {
          classes.push(key);
        }
      }
    }
  }

  args.forEach(processor);
  return classes.join(' ').trim();
}

要点

  1. 处理所有类型
  2. 数组和字符串有特殊处理