自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Semantic-UI的React實(shí)現(xiàn)(二):CSS類構(gòu)造模塊

開發(fā) 開發(fā)工具
Semantic-UI使用了更簡(jiǎn)單的類名聲明。用過Bootstrap的同學(xué)都會(huì)被其復(fù)雜的類名標(biāo)簽折磨過,例如一個(gè)簡(jiǎn)單的按鍵樣式,不論顏色或是大小,都需要btn-前綴聲明。

[[173783]]

更簡(jiǎn)單的類名標(biāo)簽

Semantic-UI使用了更簡(jiǎn)單的類名聲明。用過Bootstrap的同學(xué)都會(huì)被其復(fù)雜的類名標(biāo)簽折磨過,例如一個(gè)簡(jiǎn)單的按鍵樣式,不論顏色或是大小,都需要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> 

語(yǔ)義化的樣式聲明

樣式名并不是對(duì)某種組件進(jìn)行的類型聲明,可以通用到其他組件中。例如對(duì)于Label(標(biāo)簽)組件,也可用與button相同的CSS類聲明其樣式:

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

這樣的好處是顯而易見的,CSS類名語(yǔ)義化,剛方便使用和學(xué)習(xí)。

類名構(gòu)造模塊的實(shí)現(xiàn)

從以上細(xì)節(jié)可以看出,每個(gè)組件的類聲明均可由公用模塊生成,每個(gè)組件僅僅聲明本模塊可使用的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類負(fù)責(zé)完成。

PropsHelper

PropsHelper類主要的職責(zé)有兩個(gè):

  1. 生成各組件所需的class類集合
  2. 生成各組件的props屬性檢查定義

PropsHelper作為工具類,相關(guān)處理過程中并無狀態(tài)參與,方法應(yīng)該聲明為靜態(tài)方法(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', ...];  

對(duì)于每個(gè)組件的屬性檢查定義,可以遍歷傳入的屬性,并根據(jù)名字找到該屬性的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屬性的類型定義,根據(jù)類型定義編輯和組裝該組件的class類集合。

  1. class PropsHelper { 
  2.  
  3.     ... 
  4.      
  5.     /** 
  6.      * 根據(jù)屬性生成引用的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.    * 格式化屬性對(duì)應(yīng)的class 
  23.    */ 
  24.   static formatStyleValue(value, type) { 
  25.  
  26.     // 如果是數(shù)字型屬性 
  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.  

這樣實(shí)現(xiàn)以后,各組件在各自屬性的定義和class類聲明的處理時(shí)獲得了兩方面的益處:

  1. 屬性統(tǒng)一管理,不用再各自聲明
  2. 代碼復(fù)用性和耦合性更佳(特別是在復(fù)雜組件的使用中)
責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2016-10-18 21:26:29

Semantic-UIReact架構(gòu)

2016-10-18 21:39:59

Semantic-UIReact基本元素組件

2016-10-18 21:45:53

Semantic-UIReactJavascript

2021-01-19 12:16:10

CSS前端UI

2012-07-10 01:47:14

代碼架構(gòu)設(shè)計(jì)

2009-08-21 18:05:16

黑客模塊化主板硬件

2025-03-07 11:26:52

2025-03-06 12:44:45

2021-05-10 10:18:54

工具代碼開發(fā)

2016-11-23 16:48:20

react-nativandroidjavascript

2022-05-11 07:50:15

React UI組件庫(kù)前端

2023-01-29 08:00:00

Instagram濾鏡圖片編輯

2020-03-02 09:26:16

JavaScript程序員JSON

2021-11-09 07:26:14

CssMaterialUI React

2022-09-02 08:00:00

CSS開發(fā)框架

2011-05-16 10:35:02

jQuery

2015-04-20 17:07:38

模塊化數(shù)據(jù)中心湖南省電科院華為

2015-07-31 09:28:53

React場(chǎng)景探索

2021-05-21 06:13:35

React Hooks react-refrReact

2013-08-20 18:18:55

CSS模塊化Normalize.c
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)