天天看點

Semantic-UI的React實作(三):基本元素元件

Semantic-UI的React實作(三):基本元素元件

semantic-ui官方的react元件化已經快要接近完成了,最近開放了官網:http://react.semantic-ui.com/。從官網看,基本元件已經基本完備,還有幾個addon也在進行中。

基本元素元件

semantic-ui中的基本元素均為純css類定義的元件,沒有js的操作,是以實作起來比較簡單。有了前面基礎類uielement和輔助類propshelper的實作,要實作一個基本元素元件非常輕松。

以button元件舉例。button元件可以單獨存在,也可以作為組元件使用。另外button元件也允許簡單的animation存在,即一對顯示/隐藏的元件可以随滑鼠狀态而切換。外部調用的大緻形式為:

<button.group size='small'> 

<button primary onclick={this.handleclickbtn1}>按鍵1</button> 

<button color='blue' onclick={this.handleclickbtn2}>按鍵2</button> 

<button animated onclick={this.handleclickbtn3}> 

<button.content visible>按鍵3顯示内容</button> 

<button.content hidden>按鍵3隐藏内容</button> 

</button> 

</button.group> 

調用方式實際上是很直覺的,屬性均作為props傳入到button元件中,事件系統的回調方法也與普通方式并無二緻。相對複雜的處理,是要整理所有元件的共通屬性,定義它們的類型和取值範圍。

button

button作為基本元件,有非常多常用的屬性。這些屬性在命名上,基本參照semantic-ui的原有css類名,在button.js中用常量prop_types來定義。

const prop_types = [ 

'primary', 'secondary', 'animated', 'labeled', 'basic', 'inverted', 'color', 

'size', 'fluid', 'active', 'disabled', 'loading', 'compact', 'circular', 'positive', 

'negative', 'floated', 'attached', 'iconed', 'dropdown' 

]; 

元件根據propshelper的相關方法來生成proptypes定義,并且通過父類(uielement)的createelementstyle方法來編輯群組裝所使用的css類。另外,還通過父類的geteventcallback方法,來聲明相關的事件系統回調處理。

class button extends uielement { 

  // 類型定義 

  static proptypes = { 

    ...propshelper.createproptypes(prop_types) 

  }; 

  render() { 

    // 生成元素style 

    let style = this.createelementstyle(this.props, prop_types, 'button'); 

    return ( 

      <div id={this.props.id} classname={style} {...this.geteventcallback()} tabindex='0'> 

        {this.props.children} 

      </div> 

    ); 

  } 

button.group

與button元件類似,group元件也繼承于uielement以生成其聲明的公有屬性對應的css類。

// 屬性定義 

const group_prop_types = [ 

  'iconed', 'vertical', 'labeled', 'equalwidth', 'color', 

/** 

 * 按鍵組元件 

 */ 

class group extends uielement { 

    ...propshelper.createproptypes(group_prop_types) 

  /** 

   * 取得渲染内容 

   */ 

    let style = this.createelementstyle(this.props, prop_types, 'buttons'); 

      <div id={this.props.id} classname={style} {...this.geteventcallback()}> 

button.content

content元件的實作更簡單,直接貼代碼。

class content extends react.component { 

    visible: react.proptypes.bool 

      <div classname={this.props.visible ? 'visible content' : 'hidden content'}> 

    ) 

其他元件

通過以上示例可以看出,有了uielement和propshelper類的處理,基本元素元件的實作是非常簡單的。隻需聲明元件所使用的屬性,并使用父類方法編輯群組裝css類即可。其他元件如label,icon,image,grid等,均沿同一思路封裝即可完成。

難點是什麼?

在封裝基本元素元件的過程中,我感覺難點在于:

封裝和抽象元素的共通處理(目前已基本成型)

管理衆多元件的共通屬性(目前還在摸索中)

看過官方相關處理的源碼,感覺思路還是大體一緻的,這點讓我感覺多了一些自信(๑•̀ㅂ•́)و

作者:sheva

來源:51cto

繼續閱讀