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.pswp.cn/news/397578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397578.shtml
英文地址,請注明出處:http://en.pswp.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…