日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Semantic-UI的React實(shí)現(xiàn)(四):基本元素組件的共通處理(父類)實(shí)現(xiàn)

上一篇(Semantic-UI的React實(shí)現(xiàn)(三):基本元素組件)已經(jīng)提到過(guò),基本元素組件的實(shí)現(xiàn)因?yàn)闆](méi)有復(fù)雜的交互,僅僅是CSS類的編輯和組裝,因此實(shí)現(xiàn)原理相對(duì)比較簡(jiǎn)單。

創(chuàng)新互聯(lián)公司主要為客戶提供服務(wù)項(xiàng)目涵蓋了網(wǎng)頁(yè)視覺(jué)設(shè)計(jì)、VI標(biāo)志設(shè)計(jì)、營(yíng)銷網(wǎng)站、網(wǎng)站程序開(kāi)發(fā)、HTML5響應(yīng)式成都網(wǎng)站建設(shè)、手機(jī)網(wǎng)站制作設(shè)計(jì)、微商城、網(wǎng)站托管及成都網(wǎng)站維護(hù)公司、WEB系統(tǒng)開(kāi)發(fā)、域名注冊(cè)、國(guó)內(nèi)外服務(wù)器租用、視頻、平面設(shè)計(jì)、SEO優(yōu)化排名。設(shè)計(jì)、前端、后端三個(gè)建站步驟的完善服務(wù)體系。一人跟蹤測(cè)試的建站服務(wù)標(biāo)準(zhǔn)。已經(jīng)為成都隧道混凝土攪拌車行業(yè)客戶提供了網(wǎng)站維護(hù)服務(wù)。

但簡(jiǎn)單的東西要想做的簡(jiǎn)潔,往往不簡(jiǎn)單。

抽象與封裝

想要簡(jiǎn)潔高效地封裝數(shù)十個(gè)基本組件,將組件的相同處理部分抽象出來(lái)是非常必要的。在ES6中js新增了class關(guān)鍵字(當(dāng)然這只是一個(gè)語(yǔ)法糖,其背后的處理原理仍然是prototype那一套東西。),有了這個(gè)關(guān)鍵字js在抽象與封裝的思想上比之前更進(jìn)了一步。

當(dāng)用“繼承”的思想去考慮問(wèn)題后,組件的共通處理很明顯可以通過(guò)繼承一個(gè)共同父類來(lái)完成(通常我更愿意用接口而非繼承,無(wú)奈js學(xué)藝不精,不清楚接口繼承如何實(shí)現(xiàn))。繼承以后,所有基本組件的以下處理,均可以由父類的處理完成:

  1. 編輯和組裝CSS類
  2. 渲染組件本身
  3. 封裝事件系統(tǒng)的方法回調(diào)

實(shí)現(xiàn)細(xì)節(jié)

編輯和組裝CSS類

在系列文章二的時(shí)候有提到過(guò),基本組件的CSS編輯和組裝,在PropsHelper中實(shí)現(xiàn),所有細(xì)節(jié)對(duì)外隱藏,組件僅需聲明相關(guān)屬性即可。如Header使用到的屬性:

 
 
  1. // 屬性定義 
  2. const PROP_TYPES = PropsHelper.getDefaultPropTypes().concat([ 
  3.   'size', 'sub', 'dividing', 'floated', 'aligned', 'inverted', 'inline', 'color' 
  4. ]);  

這些可用屬性的聲明,再加上Button組件實(shí)例的props,即可編輯和組裝出所需的CSS類名集合。在Header的render方法中,僅需調(diào)用:

 
 
  1. render() { 
  2.  
  3.   // 渲染元素 
  4.   let style = this.createElementStyle(this.props, PROP_TYPES) + ' header'; 
  5.   return super.render(style); 
  6. }  

具體的生成style的細(xì)節(jié),在Header的父類UiElement中:

 
 
  1. /** 
  2.  * 生成元素的style 
  3.  */ 
  4. createElementStyle(props, propsDef) { 
  5.  
  6.   ... 
  7.   return PropsHelper.createStyle(props, propsDef) + ' ' + style; 
  8. }  

渲染組件

渲染組件也是共通處理實(shí)現(xiàn)的,作為子類的基本組件,僅需調(diào)用super.render即可:

 
 
  1. render(style, children, props) { 
  2.  
  3.   return React.createElement( 
  4.     this.props.as,                // 組件的html標(biāo)簽(默認(rèn)div) 
  5.     { 
  6.       id: this.props.id,          // 組件ID 
  7.       className: style,           // 組件class 
  8.       ...this.getEventCallback(), // 事件回調(diào)聲明 
  9.       ...props                    // 組件其他props(用于生成class的props不需要了) 
  10.     }, 
  11.     children ? children : this.props.children 
  12.   ); 
  13. }  

最開(kāi)始的時(shí)候,其實(shí)并沒(méi)有這個(gè)實(shí)現(xiàn),各個(gè)組件的渲染過(guò)程還是留在組件各自的render中的。但隨著組件的增多,發(fā)現(xiàn)這部分代碼可重用性非常大。如果有特殊的組件不適用這個(gè)過(guò)程,直接在該組件中覆寫該方法即可。這對(duì)整體代碼的可維護(hù)性也有很大程度的提高。

事件系統(tǒng)的回調(diào)

這個(gè)功能目前還在實(shí)現(xiàn)中。我的目標(biāo)是,任何組件僅需聲明而無(wú)需在該組件內(nèi)部實(shí)現(xiàn)回調(diào),由公共方法來(lái)實(shí)現(xiàn)回調(diào)處理。如一個(gè)Button想要用onClick方法,直接聲明:

 
 
  1. Btn 

但在Button組件內(nèi)部無(wú)需實(shí)現(xiàn)onClick的回調(diào)處理。(實(shí)際上也無(wú)法實(shí)現(xiàn),因?yàn)锽utton的render處理是在其父類UiElement中實(shí)現(xiàn)的)

 
 
  1. const EVENT_CALLBACK = [ 
  2.   'onKeyDown', 'onKeyPress', 'onKeyUp', 
  3.   'onFocus', 'onBlur', 
  4.   'onChange', 'onInput', 'onSubmit', 
  5.   'onClick', 'onContextMenu', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 
  6.   'onDragExit', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onMouseDown', 
  7.   'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 
  8.   'onSelect', 
  9.   'onTouchCancel', 'onTouchEnd', 'onTouchMove', 'onTouchStart', 
  10.   'onScroll', 'onWheel', 
  11.   'onLoad', 'onError', 
  12.   'onTransitionEnd', 
  13.   'onAnimationStart', 'onAnimationEnd', 'onAnimationIteration', 
  14. ];  

對(duì)于事件系統(tǒng)的回調(diào),在constructor中是這樣定義的:

 
 
  1. constructor(props) { 
  2.   super(props); 
  3.  
  4.   let eventProps = {}; 
  5.   for (let key in props) { 
  6.     if (key.indexOf('on') == 0 && EVENT_CALLBACK.indexOf(key) >= 0) { 
  7.       eventProps[key] = this.handleCallback.bind(this, key); 
  8.     } 
  9.   } 
  10.  
  11.   this.eventCallbacks = eventProps; 
  12. }  

這個(gè)組件傳入的props中如果包含'onXXX'并且這個(gè)'onXXX'在EVENT_CALLBACK中有定義,則認(rèn)為該組件聲明了一個(gè)事件系統(tǒng)的回調(diào),那么UiElement將綁定這個(gè)回調(diào)的具體處理。處理過(guò)程如此實(shí)現(xiàn):

 
 
  1. handleCallback(callback, e) { 
  2.  
  3.   if (this.props.callback) { 
  4.     this.props.callback(e); 
  5.   } 
  6. }  

回顧

在UiElement中,實(shí)現(xiàn)了三類公共功能供基本組件類調(diào)用:

  1. 編輯和組裝CSS類
  2. 渲染組件本身
  3. 封裝事件系統(tǒng)的方法回調(diào)

實(shí)現(xiàn)以后,基本組件類的相同處理均被抽離出來(lái),僅剩下一些聲明性質(zhì)的代碼。例如Header組件的實(shí)現(xiàn)被簡(jiǎn)化為:

 
 
  1. import React from 'react'; 
  2.  
  3. import PropsHelper from './PropsHelper'; 
  4. import UiElement from './UiElement'; 
  5.  
  6. // 屬性定義 
  7. const PROP_TYPES = PropsHelper.getDefaultPropTypes().concat([ 
  8.   'size', 'sub', 'dividing', 'floated', 'aligned', 'inverted', 'inline', 'color' 
  9. ]); 
  10.  
  11. /** 
  12.  * 標(biāo)題組件 
  13.  */ 
  14. class Header extends UiElement { 
  15.  
  16.   // 類型定義 
  17.   static propTypes = { 
  18.     ...PropsHelper.createPropTypes(PROP_TYPES) 
  19.   }; 
  20.  
  21.   // 默認(rèn)值定義 
  22.   static defaultProps = { 
  23.     ...PropsHelper.getDefaultPropsValue(PROP_TYPES) 
  24.   }; 
  25.  
  26.   /** 
  27.    * 取得渲染內(nèi)容 
  28.    */ 
  29.   render() { 
  30.  
  31.     // 渲染元素 
  32.     let style = this.createElementStyle(this.props, PROP_TYPES) + ' header'; 
  33.     return super.render(style); 
  34.   } 
  35.  
  36. export default Header;  

這樣的好處是顯而易見(jiàn)的:

  1. 簡(jiǎn)化實(shí)現(xiàn)代碼提高可閱讀性
  2. 封裝共通處理提高可維護(hù)性
  3. 通過(guò)方法覆寫保持可擴(kuò)展性

通過(guò)這幾篇,基礎(chǔ)組件的封裝處理應(yīng)該說(shuō)完了,接下來(lái)的幾篇打算說(shuō)說(shuō)復(fù)雜組件的實(shí)現(xiàn)。在完成所有組件的封裝后,還打算擴(kuò)展一些復(fù)雜組件的功能(代碼丑,只能多實(shí)現(xiàn)些功能了。總之要和官方做成不一樣的/(ㄒoㄒ)/~~)。


當(dāng)前標(biāo)題:Semantic-UI的React實(shí)現(xiàn)(四):基本元素組件的共通處理(父類)實(shí)現(xiàn)
URL標(biāo)題:http://www.dlmjj.cn/article/dhjcgph.html