成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Semantic-UI的React實現(二):CSS類構造模塊

開發 開發工具
Semantic-UI使用了更簡單的類名聲明。用過Bootstrap的同學都會被其復雜的類名標簽折磨過,例如一個簡單的按鍵樣式,不論顏色或是大小,都需要btn-前綴聲明。

[[173783]]

更簡單的類名標簽

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. 代碼復用性和耦合性更佳(特別是在復雜組件的使用中)
責任編輯:龐桂玉 來源: segmentfault
相關推薦

2016-10-18 21:26:29

Semantic-UIReact架構

2016-10-18 21:39:59

Semantic-UIReact基本元素組件

2016-10-18 21:45:53

Semantic-UIReactJavascript

2021-01-19 12:16:10

CSS前端UI

2009-08-21 18:05:16

黑客模塊化主板硬件

2012-07-10 01:47:14

代碼架構設計

2025-03-07 11:26:52

2025-03-06 12:44:45

2021-05-10 10:18:54

工具代碼開發

2016-11-23 16:48:20

react-nativandroidjavascript

2020-03-02 09:26:16

JavaScript程序員JSON

2022-05-11 07:50:15

React UI組件庫前端

2021-11-09 07:26:14

CssMaterialUI React

2023-01-29 08:00:00

Instagram濾鏡圖片編輯

2022-09-02 08:00:00

CSS開發框架

2011-05-16 10:35:02

jQuery

2015-04-20 17:07:38

模塊化數據中心湖南省電科院華為

2015-07-31 09:28:53

React場景探索

2013-08-20 18:18:55

CSS模塊化Normalize.c

2021-05-21 06:13:35

React Hooks react-refrReact
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区成人 | 国产精品海角社区在线观看 | 久久精品欧美电影 | 在线观看中文视频 | 毛片一区二区三区 | 亚洲在线一区二区 | 伊色综合久久之综合久久 | 在线视频国产一区 | 日日夜夜天天干 | 国产视频精品免费 | 91动漫在线观看 | 九九伊人sl水蜜桃色推荐 | 一区二区三区四区电影 | 国产一区二区三区久久久久久久久 | 国产99免费视频 | 九九热精品在线 | 在线视频 中文字幕 | 久久99国产精一区二区三区 | 精品蜜桃一区二区三区 | 亚洲精品视频二区 | av资源在线看 | 成人做爰9片免费看网站 | 国产精品久久久久久久久久久免费看 | 午夜影院网站 | 国产免费黄网 | 中文字幕av网站 | 国产精品区一区二区三 | 亚洲成人网在线播放 | 亚洲精品99 | 三级av在线 | 精品一区在线看 | 99精品电影| 久久久久99| 欧美精品三区 | 久久久九九 | 亚洲美女在线一区 | 国产成人精品一区二区 | www.欧美.com | 男人午夜视频 | 午夜影院免费体验区 | 亚洲一区二区三区在线播放 |