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

更简单的类名标签

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

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

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

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

语义化的样式声明

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

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

这样的好处是显而易见的,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 (<div id={this.props.id} className={style} tabIndex='0'>{this.props.children}</div>);}...
}

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://www.mzph.cn/news/397578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

T-SQL LIKE子句 模糊查询

MS SQL Server LIKE子句用于使用通配符运算符将值与类似值进行比较。 有两个通配符与LIKE运算符结合使用: 百分号&#xff08;&#xff05;&#xff09;下划线&#xff08;_&#xff09;百分号表示零个&#xff0c;一个或多个字符。 下划线表示单个数字或字符。 符号可以组合使…

ext springmvc mysql_基于ExtJs6前台,SpringMVC-Spring-Mybatis,resteasy,mysql无限极表设计,实现树状展示数据(treepanel)...

先从后台讲起1.表的设计2.mysql查询很容易&#xff0c;关键是要把id,text,parentId查出来/p>"http://mybatis.org/dtd/mybatis-3-mapper.dtd">SELECTbp.id,bb.name brandName,bp.name text,bp.photo_url photoUrl,bp.number,bp.add_time addTime,bp.modify_tim…

C# 之 Int16 Int32 Int64 的区别

Int16 值类型表示值介于 -32768 到 32767 之间的有符号整数。 Int32 值类型表示值介于 -2,147,483,648 到 2,147,483,647 之间的有符号整数。 Int64 值类型表示值介于 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 之间的整数。 --------------------------------…

php说明代码怎么写,代码怎么写 - 起步 - PHP基础 - KK的小故事

起步 - 代码怎么写 作者&#xff1a;KK发表日期&#xff1a;2016.3.9要写PHP代码就需要建立.php后缀的文件,并且在文件里要以<?php 具体代码 ?>这样的形式来书写PHP代码我们在网站目录下新建一个叫index.php的文件,并在里面编写这样的代码:echo Hello World!;?>然后…

python中的计算符号

1、算数计算符号&#xff1a; - * /   //&#xff08;取整&#xff09;  %&#xff08;取余&#xff09;  **&#xff08;次方&#xff09; 1 >>> 682 143 >>> 9-34 65 >>> 3*46 127 >>> 16/28 8.09 >>> 9/2 10 4.5 11 >…

MySQL 索引优化全攻略

2019独角兽企业重金招聘Python工程师标准>>> 所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找。而用的最多,并且是mysql默认的就是二叉树算法 BTREE,通过BTREE算法建立索引的字…

织梦DedeCMS实现 三级栏目_二级栏目_一级栏目_网站名称 的效果代码

1.将官方原来的排列方式反过来&#xff0c;找到include/typelink.class.php第164行 $this->valuePositionName $tinfos[typename].$this->SplitSymbol.$this->valuePositionName; 修改为&#xff1a; $this->valuePositionName $this->valuePositionName.$…

MyEclipse 14 设置文件特定的打开方式

2019独角兽企业重金招聘Python工程师标准>>> 打开windows -> preferences&#xff1b; 转载于:https://my.oschina.net/AaronDMC/blog/755481

安装安全狗后php5.5无法访问,关于安全狗的详细介绍

这篇文章主要介绍了win2008 R2安装网站安全狗提示HTTP 错误 500.21的解决方法,需要的朋友可以参考下WINDOWS 2008 R2系统IIS7.5&#xff0c;在没安装网站安全狗前一切正常&#xff0c;安装网站安全狗3.3版后&#xff0c;有部分php网站无法访问。提示如下错误&#xff1a;HTTP 错…

Android 里的数据储存

数据持久化关于数据储存,这个话题已经被反复讨论过很多次了,我是不建议把网络存储这种方式纳入到数据储存的范围的,因为这个和Android没多少关系,因此就有如下的分类: 本地储存(也称之为数据持久化,包含文件储存,SharedPreferences,SQLite储存和ContentProvider(内容提供者)) 内…

[故障解决]Mysql爆出ERROR 1044 (42000)的错误怎么办?

情况如图&#xff0c;使用dvlopenhls可以登陆到这个host&#xff0c;并且可以查看里面的tables&#xff0c;但是使用tables其中的op_flow就会报错&#xff0c;查看了很多地方&#xff0c;有人说要改密码&#xff0c;有人说要grant给权限。五花八门&#xff0c;乱七八糟。其实这…

php如何拼接数组,PHP怎么合并数组

本篇文章主要给大家介绍PHP怎么实现两个数组合并&#xff0c;并且其中一个数组的值为下标&#xff0c;另一个数组的值为对应的值。PHP进行普通数组的合并&#xff0c;相信大家都已经有所掌握。但是对于新手朋友们来说&#xff0c;合并两个数组&#xff0c;新数组的下标和值分别…

UITableView,UICollectionView,UIScrollView快速返回顶部

UITableView&#xff0c; UICollectionView都继承自UIScrollView&#xff0c;所以可以使用UIScrollView的方法&#xff0c;设置显示内容的偏移量 [self.tableView setContentOffset:CGPointMake(0, 0) animated:YES]; 原文链接http://wpdome.sinaapp.com/?p189转载于:https://…

代码编译 Compile、Make、Build 的区别

代码编译 Compile、Make、Build 的区别 https://blog.csdn.net/fanzheng220112583/article/details/7780250 VC6.0中Compile和Build的区别"compile"是“编译”的意思&#xff0c;“build”是“链接”的意思。compile 的作用是对你的代码进行语法检查&#xff0c;将你…

php5 mongodb,ThinkPHP5之Mongodb使用技巧

安装composer require topthink/think-mongo目录结构实践安装完成之后&#xff0c;就根据文档中的介绍开始进行codeing了&#xff0c;但是……首先我们来看下官方的使用文档配置说明不要以为这样就能够正常的使用了&#xff0c;结果远比预想中的艰难直接爆了这样的错误&#xf…

查看并设置oracle并发连接数

1.Sql代码1.select count(*) from v$process select count(*) from v$process --当前的数据库连接数2.Sql代码1.select value from v$parameter where name processes select value from v$parameter where name processes--数据库允许的最大连接数3.Sql代码1.alter system …

spring boot 下载

spring boot 下载 posted on 2018-07-06 22:38 zhouixi 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/1-Admin/p/9275802.html

15个Java多线程面试题

2019独角兽企业重金招聘Python工程师标准>>> 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位&#xff0c;那么你应该准备很多关于多线程的问题。在投资银行业务中多线程和并发是一个非常受欢迎的话题&…

java 将3变为03,03 Java序列化引发的血案

1、前言《手册》第 9 页 “OOP 规约” 部分有一段关于序列化的约定【强制】当序列化类新增属性时&#xff0c;请不要修改 serialVersionUID 字段&#xff0c;以避免反序列失败&#xff1b;如果完全不兼容升级&#xff0c;避免反序列化混乱&#xff0c;那么请修改 serialVersion…

《The Pomodoro Technique》

番茄工作法&#xff0c;专注当下&#xff0c;远离拖延焦虑症 简介What to solveHow to useSome applications自我总结简介 番茄工作法是简单易行的时间管理方法&#xff0c;是由弗朗西斯科西里洛于1992年创立的一种相对于GTD更微观的时间管理方法。 What to solve 各种Deadline…