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

简介:


更简单的类名标签

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.  
  5. let PROP_TYPES = ['primary''size''color''basic''active', ...]; 
  6.  
  7. class Button extends UiElement { 
  8.      
  9.     static propTypes = { 
  10.         ...PropHelper.createPropTypes(PROP_TYPES) 
  11.     }; 
  12.      
  13.     render() { 
  14.          
  15.         let style = this.createElementStyle(this.props, PROP_TYPES, 'button'); 
  16.          
  17.         return ( 
  18.             <div id={this.props.id} className={style} tabIndex='0'
  19.                 {this.props.children} 
  20.             </div> 
  21.         ); 
  22.     } 
  23.      
  24.     ... 
  25. }  

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.      * 生成属性检查 
  7.      */ 
  8.     static createPropTypes(propTypes) { 
  9.          
  10.         let result = {}; 
  11.         propTypes.forEach(function(typeName, index) { 
  12.      
  13.             if (BOOL_PROPS.indexOf(typeName) >= 0) { 
  14.               result[typeName] = React.PropTypes.bool; 
  15.             } 
  16.             else if (STRING_PROPS.indexOf(typeName) >= 0) { 
  17.               result[typeName] = React.PropTypes.string; 
  18.             } 
  19.             else if (NUMBER_PROPS.indexOf(typeName) >= 0) { 
  20.               result[typeName] = React.PropTypes.number; 
  21.             } 
  22.             else if (COLLECTION_PROPS.indexOf(typeName) >= 0) { 
  23.               result[typeName] = React.PropTypes.oneOf(PROPS_VALUES[typeName]); 
  24.             } 
  25.         }); 
  26.          
  27.         return result; 
  28.     } 
  29. }  

class类集合组装

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


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

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

  1. 属性统一管理,不用再各自声明
  2. 代码复用性和耦合性更佳(特别是在复杂组件的使用中)
作者:sheva
来源:51CTO
相关文章
|
2月前
|
监控 数据可视化 数据挖掘
UI 设计团队协作有妙招!哪类办公软件能拔高效率?
本文介绍了6款适合游戏原画团队的高效协作办公软件,包括板栗看板及5款国外软件。这些软件通过可视化任务管理、灵活的任务分配、强大的文件管理和版本控制、便捷的沟通机制等功能,帮助团队提升创作效率,促进成员间无缝协作,适应不同规模和需求的游戏原画项目。
62 15
|
3月前
|
前端开发
create-react-app 如何使用 less/sass 和 react-css-modules?
本文详细介绍了在 create-react-app 项目中如何使用 less/sass 和 react-css-modules 来管理和应用样式。首先,通过安装相应依赖并配置 webpack 支持 less/sass;接着,介绍如何使用这些预处理器编写样式;最后,讲解了如何配置和使用 react-css-modules 实现样式的模块化管理,以及如何结合使用 less/sass 和 react-css-modules 提高开发效率和代码质量。
58 3
|
4月前
|
前端开发 JavaScript
React Tailwind CSS
10月更文挑战第12天
38 1
|
4月前
|
前端开发 容器
React 使用 CSS 样式
10月更文挑战第12天
57 0
|
5月前
|
JavaScript 前端开发
react Or vue中引入animate.css
本文介绍了如何在React或Vue项目中引入animate.css库来使用动画效果,包括通过npm安装或在线链接引入,并展示了如何在React组件和Vue路由过渡中使用动画类。
113 0
|
6月前
|
前端开发 Java UED
JSF 面向组件开发究竟藏着何种奥秘?带你探寻可复用 UI 组件设计的神秘之路
【8月更文挑战第31天】在现代软件开发中,高效与可维护性至关重要。JavaServer Faces(JSF)框架通过其面向组件的开发模式,提供了构建复杂用户界面的强大工具,特别适用于设计可复用的 UI 组件。通过合理设计组件的功能与外观,可以显著提高开发效率并降低维护成本。本文以一个具体的 `MessageComponent` 示例展示了如何创建可复用的 JSF 组件,并介绍了如何在 JSF 页面中使用这些组件。结合其他技术如 PrimeFaces 和 Bootstrap,可以进一步丰富组件库,提升用户体验。
76 0
|
6月前
|
前端开发 JavaScript 开发者
【前端革新力】React与CSS-in-JS完美邂逅:从styled-components到emotion,全面解析样式管理新趋势的实战应用与优势剖析!
【8月更文挑战第31天】CSS-in-JS 作为一种新兴的样式管理方式,近年来在前端社区受到广泛关注。它将样式嵌入 JavaScript,实现了样式与逻辑的高度耦合,提升了开发效率并解决了全局样式污染等问题。本文通过具体代码示例,探讨 CSS-in-JS 在 React 开发中的应用,并分享实践心得。首先介绍了 CSS-in-JS 的基本概念,然后详细展示了如何使用 styled-components 和 emotion 这两个流行库创建样式化组件。
328 0
|
7月前
|
前端开发
【UI】 elementui的dialog弹窗打开时CSS的BUG | 滚动条消失bug
【UI】 elementui的dialog弹窗打开时CSS的BUG | 滚动条消失bug
246 0
|
9月前
|
前端开发 JavaScript 开发者
【专栏:HTML与CSS前端技术趋势篇】前端框架(React/Vue/Angular)与HTML/CSS的结合使用
【4月更文挑战第30天】前端框架React、Vue和Angular助力UI开发,通过组件化、状态管理和虚拟DOM提升效率。这些框架与HTML/CSS结合,使用模板语法、样式管理及组件化思想。未来趋势包括框架简化、Web组件标准采用和CSS在框架中角色的演变。开发者需紧跟技术发展,掌握新工具,提升开发效能。
134 11
|
9月前
|
XML 前端开发 JavaScript
前端CSS样式零基础教学总结,UI、前端开发都适用
前端CSS样式零基础教学总结,UI、前端开发都适用
115 2

热门文章

最新文章