博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Semantic-UI的React实现(二):CSS类构造模块
阅读量:6248 次
发布时间:2019-06-22

本文共 3360 字,大约阅读时间需要 11 分钟。

更简单的类名标签

Semantic-UI使用了更简单的类名声明。

用过Bootstrap的同学都会被其复杂的类名标签折磨过,例如一个简单的按键样式,不论颜色或是大小,都需要btn-前缀声明:

在Semantic-UI中,类名更接近自然表述:

语义化的样式声明

样式名并不是对某种组件进行的类型声明,可以通用到其他组件中。例如对于Label(标签)组件,也可用与button相同的CSS类声明其样式:

Blue Label

这样的好处是显而易见的,CSS类名语义化,刚方便使用和学习。

类名构造模块的实现

从以上细节可以看出,每个组件的类声明均可由公用模块生成,每个组件仅仅声明本模块可使用的Props即可。以Button举例如下:

import PropHelper from './PropHelper';import UiElement from './UiElement';...let PROP_TYPES = ['primary', 'size', 'color', 'basic', 'active', ...];class Button extends UiElement {        static propTypes = {        ...PropHelper.createPropTypes(PROP_TYPES)    };        render() {                let style = this.createElementStyle(this.props, PROP_TYPES, 'button');                return (            
{this.props.children}
); } ...}

Button类声明了其可以使用的class类名,通过共通处理生成style即可。生成style的共同处理,由PropsHelper类负责完成。

PropsHelper

PropsHelper类主要的职责有两个:

  1. 生成各组件所需的class类集合

  2. 生成各组件的props属性检查定义

PropsHelper作为工具类,相关处理过程中并无状态参与,方法应该声明为静态方法(static)。

props属性检查

Semantci-UI中的所有class类属性的集合是可枚举的,这些属性直接在PropsHelper中定义即可:

const BOOL_PROPS = ['ui', 'active', 'disabled', 'circular', ...];const STRING_PROPS = ['icon', 'appendClass', ...],const NUMBER_PROPS = ['column', 'wide', ...],const COLLECTION_PROPS = ['color', 'size', 'position', ...];

对于每个组件的属性检查定义,可以遍历传入的属性,并根据名字找到该属性的PropTypes定义。

class PropsHelper {        ...        /**     * 生成属性检查     */    static createPropTypes(propTypes) {                let result = {};        propTypes.forEach(function(typeName, index) {                if (BOOL_PROPS.indexOf(typeName) >= 0) {              result[typeName] = React.PropTypes.bool;            }            else if (STRING_PROPS.indexOf(typeName) >= 0) {              result[typeName] = React.PropTypes.string;            }            else if (NUMBER_PROPS.indexOf(typeName) >= 0) {              result[typeName] = React.PropTypes.number;            }            else if (COLLECTION_PROPS.indexOf(typeName) >= 0) {              result[typeName] = React.PropTypes.oneOf(PROPS_VALUES[typeName]);            }        });                return result;    }}

class类集合组装

与createPropTypes同样的思路,将传入的组件props遍历一遍,找到各自prop属性的类型定义,根据类型定义编辑和组装该组件的class类集合。

class PropsHelper {    ...        /**     * 根据属性生成引用的class     */    static createStyle(props, types) {    let style = '';    for (let i = 0; i < types.length; i++) {      let type = types[i];      if (props.hasOwnProperty(type)) {        style += this.formatStyleValue(props[type], type);      }    }    return style;  }    /**   * 格式化属性对应的class   */  static formatStyleValue(value, type) {    // 如果是数字型属性    if (NUMBER_PROPS.indexOf(type) >= 0) {      return ' ' + this.getNumberStr(value) + ' ' + type;    }    else if (COLLECTION_PROPS.indexOf(type) >= 0) {      if (type == 'size') return ' ' + value;      return ' ' + value + ' ' + type;    }    else if (BOOL_PROPS.indexOf(type) >= 0) {      if (!value) return '';      if (type == 'imaged') return ' image';      if (type == 'iconed') return ' icon';      if (type == 'long') return ' long scrolling';      if (type == 'equalWidth') return '';      return ' ' + type;    }    else if (STRING_PROPS.indexOf(type) >= 0) {      return ' ' + value;    }    else {      return '';    }  }}

这样实现以后,各组件在各自属性的定义和class类声明的处理时获得了两方面的益处:

  1. 属性统一管理,不用再各自声明

  2. 代码复用性和耦合性更佳(特别是在复杂组件的使用中)

转载地址:http://idgia.baihongyu.com/

你可能感兴趣的文章
Gmail 即将落实阻止 JavaScript 的安全策略
查看>>
【PMP认证考试之个人总结】第 10 章 项目风险管理
查看>>
从超模转职成为程序媛是一种怎样的体验
查看>>
《C++入门经典(第6版)》——1.2 编译和链接源代码
查看>>
五个改善你服务器日志的技术
查看>>
Using Big Data to Build Customer Loyalty
查看>>
在 Ubuntu 中使用 NTP 进行时间同步
查看>>
《七周七数据库》一一2.3 第2天:高级查询、代码和规则
查看>>
《Java EE 7精粹》—— 1.3 Java EE 7有什么新功能
查看>>
利用OpenVSwitch构建多主机Docker网络
查看>>
如何从 Ubuntu 14.04 升级到 Ubuntu 14.10
查看>>
Andrew Ng机器学习公开课笔记 – Factor Analysis
查看>>
Docker Swarm介绍
查看>>
天猫618的美妆黑马出现了,背后是“肉毒杆菌之父”
查看>>
《HTML5 Canvas开发详解》——2.6 在画布上合成
查看>>
《妙手回春:网站可用性测试及优化指南(修订版)》一开场白:管我叫以实玛利吧...
查看>>
screen 命令使用及示例
查看>>
《C++游戏编程入门(第4版)》——1.4 使用算术运算符
查看>>
Linux有问必答:如何在Linux中直接挂载LVM分区
查看>>
《Nmap渗透测试指南》—第2章2.5节TCP SYN Ping扫描
查看>>