更简单的类名标签

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

  1. <button type="button" class="btn btn-primary btn-lg active">Primary button</button>

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

  1. <button class="ui blue large active button">Blue Button</button>

语义化的样式声明

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

  1. <div class="ui blue large active label">Blue Label</div>

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

类名构造模块的实现

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

  1. import PropHelper from './PropHelper';
  2. import UiElement from './UiElement';
  3. ...
  4. let PROP_TYPES = ['primary', 'size', 'color', 'basic', 'active', ...];
  5. class Button extends UiElement {
  6. static propTypes = {
  7. ...PropHelper.createPropTypes(PROP_TYPES)
  8. };
  9. render() {
  10. let style = this.createElementStyle(this.props, PROP_TYPES, 'button');
  11. return (
  12. <div id={this.props.id} className={style} tabIndex='0'>
  13. {this.props.children}
  14. </div>
  15. );
  16. }
  17. ...
  18. }

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

PropsHelper

PropsHelper类主要的职责有两个:

  1. 生成各组件所需的class类集合
  2. 生成各组件的props属性检查定义

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

props属性检查

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

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

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

  1. class PropsHelper {
  2. ...
  3. /**
  4. * 生成属性检查
  5. */
  6. static createPropTypes(propTypes) {
  7. let result = {};
  8. propTypes.forEach(function(typeName, index) {
  9. if (BOOL_PROPS.indexOf(typeName) >= 0) {
  10. result[typeName] = React.PropTypes.bool;
  11. }
  12. else if (STRING_PROPS.indexOf(typeName) >= 0) {
  13. result[typeName] = React.PropTypes.string;
  14. }
  15. else if (NUMBER_PROPS.indexOf(typeName) >= 0) {
  16. result[typeName] = React.PropTypes.number;
  17. }
  18. else if (COLLECTION_PROPS.indexOf(typeName) >= 0) {
  19. result[typeName] = React.PropTypes.oneOf(PROPS_VALUES[typeName]);
  20. }
  21. });
  22. return result;
  23. }
  24. }

class类集合组装

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

  1. class PropsHelper {
  2. ...
  3. /**
  4. * 根据属性生成引用的class
  5. */
  6. static createStyle(props, types) {
  7. let style = '';
  8. for (let i = 0; i < types.length; i++) {
  9. let type = types[i];
  10. if (props.hasOwnProperty(type)) {
  11. style += this.formatStyleValue(props[type], type);
  12. }
  13. }
  14. return style;
  15. }
  16. /**
  17. * 格式化属性对应的class
  18. */
  19. static formatStyleValue(value, type) {
  20. // 如果是数字型属性
  21. if (NUMBER_PROPS.indexOf(type) >= 0) {
  22. return ' ' + this.getNumberStr(value) + ' ' + type;
  23. }
  24. else if (COLLECTION_PROPS.indexOf(type) >= 0) {
  25. if (type == 'size') return ' ' + value;
  26. return ' ' + value + ' ' + type;
  27. }
  28. else if (BOOL_PROPS.indexOf(type) >= 0) {
  29. if (!value) return '';
  30. if (type == 'imaged') return ' image';
  31. if (type == 'iconed') return ' icon';
  32. if (type == 'long') return ' long scrolling';
  33. if (type == 'equalWidth') return '';
  34. return ' ' + type;
  35. }
  36. else if (STRING_PROPS.indexOf(type) >= 0) {
  37. return ' ' + value;
  38. }
  39. else {
  40. return '';
  41. }
  42. }
  43. }

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

  1. 属性统一管理,不用再各自声明
  2. 代码复用性和耦合性更佳(特别是在复杂组件的使用中)
作者:sheva
来源:51CTO

Semantic-UI的React实现(二):CSS类构造模块相关推荐

  1. Semantic-UI的React实现(二):CSS类构造模块 1

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

  2. semantic ui框架学习笔记二

    评论组件 文档里的评论组件介绍的比较清晰.这里我就挑一个我喜欢的格式展示出来: <div class="ui comments"><h3 class=" ...

  3. Semantic UI术语

    Semantic UI 的特定术语 术语类型 一.组件类型 (Types of Components) 二.工程术语 (Project Terminology) 三.定义术语 (Definition ...

  4. SAP UI5 初学者教程之十二 - 使用 CSS 类对 UI 进行进一步美化试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  5. semantic ui html5,css中什么是Semantic UI框架?

    什么是Semantic UI框架? Semantic UI是一个用户友好度爆表的响应式前端框架,具备3000多个主题变量和50多个UI组件,可以快速搭建漂亮的网页.Semantic UI还集成了许多第 ...

  6. semantic.css,CSS框架:Semantic UI的优缺点

    Semantic UI 作为一名全栈开发人员,Jack Lukic使用自然语言原理创建了Semantic UI框架.凭借着jQuery和LESS功能,Semantic UI提供了光滑.平整且精细的外观 ...

  7. React攻略秘籍二:React中使用css的五种方法(包括less与styled-compenents)

    一.前言 相信学过vue与react的小伙伴们应该都知道react使用css是多么麻烦,他没有像vue一样的规定好的样式,没有给css规定的作用域这也就react中一个组件样式会出现干扰另外一个组件样 ...

  8. 【项目实战】个人博客(SpringBoot,SSM,thymeleaf,Semantic UI)——从设计思路到部署一站式教学

    一.前言 1.项目背景 此项目并非原创,项目原型是李仁密老师的作品,具体的教学视频来自b站https://www.bilibili.com/video/BV1nE411r7TF,不过up主貌似也是搬运 ...

  9. SAP UI5 应用开发教程之三十六 - 使用 Chrome 开发者工具 Elements 标签动态修改 CSS 类试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

最新文章

  1. 排序算法(更新ing)(C语言实现)(认真的不像实力派)
  2. python中try_python中try...excpet多种使用方法
  3. ANSYS——后处理中单元表(ELEMENT table)的作用、创建、使用
  4. Serverless在SaaS领域的最佳实践
  5. 重磅!AI大牛邢波出任AI大学校长,李开复姚期智都是校董
  6. 想快速体验谷歌 Fuchsia OS?FImage 项目来了!
  7. Data truncation: Data too long for column 'XXXXX' at row 1
  8. markdown在Windows10下安装后启动出现的错误以及一些解决方案
  9. 160.相交链表(力扣leetcode) 博主可答疑该问题
  10. iocomp控件 Crack V512-sp6
  11. 工程量计算稿1.54安装教程 v1.54pjb
  12. C#条形码图像生成库
  13. 前端常用PS技巧总结之更换图片背景颜色
  14. 温度传感器MLX90614的STM32驱动实现
  15. 小学生计算机课如何上,如何上好小学信息技术课
  16. DDSM多区域标注之处理overlay文件框出病灶区域
  17. Skype for Business Web 应用
  18. Tableau:画桑基图(详细版)
  19. 工作流表单手写签章控件失效的处理方法
  20. Office 2003轻松安装

热门文章

  1. 在多线程中使用spring的bean
  2. mac搭建本地svn
  3. WPF中StringToImage和BoolToImage简单用法
  4. WCF 宿主与通信模式(二)
  5. hdu.1430.魔板(bfs + 康托展开)
  6. eclipse解决Android Library Project jar包重复导致的问题
  7. ios 内存管理 心得
  8. 微信公众平台的服务号和订阅号
  9. Springfox-swagger使用详解
  10. 面经——嵌入式软件工程师ARM体系与架构相关