国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Semantic-UI的React實現(四):基本元素組件的共通處理(父類)實現

woshicixide / 1525人閱讀

摘要:上一篇的實現三基本元素組件已經提到過,基本元素組件的實現因為沒有復雜的交互,僅僅是類的編輯和組裝,因此實現原理相對比較簡單。事件系統的回調這個功能目前還在實現中。

上一篇(Semantic-UI的React實現(三):基本元素組件)已經提到過,基本元素組件的實現因為沒有復雜的交互,僅僅是CSS類的編輯和組裝,因此實現原理相對比較簡單。

但簡單的東西要想做的簡潔,往往不簡單。

抽象與封裝

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

當用“繼承”的思想去考慮問題后,組件的共通處理很明顯可以通過繼承一個共同父類來完成(通常我更愿意用接口而非繼承,無奈js學藝不精,不清楚接口繼承如何實現)。繼承以后,所有基本組件的以下處理,均可以由父類的處理完成:

編輯和組裝CSS類

渲染組件本身

封裝事件系統的方法回調

實現細節 編輯和組裝CSS類

在系列文章二的時候有提到過,基本組件的CSS編輯和組裝,在PropsHelper中實現,所有細節對外隱藏,組件僅需聲明相關屬性即可。如Header使用到的屬性:

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

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

render() {

  // 渲染元素
  let style = this.createElementStyle(this.props, PROP_TYPES) + " header";
  return super.render(style);
}

具體的生成style的細節,在Header的父類UiElement中:

/**
 * 生成元素的style
 */
createElementStyle(props, propsDef) {

  ...
  return PropsHelper.createStyle(props, propsDef) + " " + style;
}
渲染組件

渲染組件也是共通處理實現的,作為子類的基本組件,僅需調用super.render即可:

render(style, children, props) {

  return React.createElement(
    this.props.as,                // 組件的html標簽(默認div)
    {
      id: this.props.id,          // 組件ID
      className: style,           // 組件class
      ...this.getEventCallback(), // 事件回調聲明
      ...props                    // 組件其他props(用于生成class的props不需要了)
    },
    children ? children : this.props.children
  );
}

最開始的時候,其實并沒有這個實現,各個組件的渲染過程還是留在組件各自的render中的。但隨著組件的增多,發現這部分代碼可重用性非常大。如果有特殊的組件不適用這個過程,直接在該組件中覆寫該方法即可。這對整體代碼的可維護性也有很大程度的提高。

事件系統的回調

這個功能目前還在實現中。我的目標是,任何組件僅需聲明而無需在該組件內部實現回調,由公共方法來實現回調處理。如一個Button想要用onClick方法,直接聲明:

但在Button組件內部無需實現onClick的回調處理。(實際上也無法實現,因為Button的render處理是在其父類UiElement中實現的)

const EVENT_CALLBACK = [
  "onKeyDown", "onKeyPress", "onKeyUp",
  "onFocus", "onBlur",
  "onChange", "onInput", "onSubmit",
  "onClick", "onContextMenu", "onDoubleClick", "onDrag", "onDragEnd", "onDragEnter",
  "onDragExit", "onDragLeave", "onDragOver", "onDragStart", "onDrop", "onMouseDown",
  "onMouseEnter", "onMouseLeave", "onMouseMove", "onMouseOut", "onMouseOver", "onMouseUp",
  "onSelect",
  "onTouchCancel", "onTouchEnd", "onTouchMove", "onTouchStart",
  "onScroll", "onWheel",
  "onLoad", "onError",
  "onTransitionEnd",
  "onAnimationStart", "onAnimationEnd", "onAnimationIteration",
];

對于事件系統的回調,在constructor中是這樣定義的:

constructor(props) {
  super(props);

  let eventProps = {};
  for (let key in props) {
    if (key.indexOf("on") == 0 && EVENT_CALLBACK.indexOf(key) >= 0) {
      eventProps[key] = this.handleCallback.bind(this, key);
    }
  }

  this.eventCallbacks = eventProps;
}

這個組件傳入的props中如果包含"onXXX"并且這個"onXXX"在EVENT_CALLBACK中有定義,則認為該組件聲明了一個事件系統的回調,那么UiElement將綁定這個回調的具體處理。處理過程如此實現:

handleCallback(callback, e) {

  if (this.props.callback) {
    this.props.callback(e);
  }
}
回顧

在UiElement中,實現了三類公共功能供基本組件類調用:

編輯和組裝CSS類

渲染組件本身

封裝事件系統的方法回調

實現以后,基本組件類的相同處理均被抽離出來,僅剩下一些聲明性質的代碼。例如Header組件的實現被簡化為:

import React from "react";

import PropsHelper from "./PropsHelper";
import UiElement from "./UiElement";

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

/**
 * 標題組件
 */
class Header extends UiElement {

  // 類型定義
  static propTypes = {
    ...PropsHelper.createPropTypes(PROP_TYPES)
  };

  // 默認值定義
  static defaultProps = {
    ...PropsHelper.getDefaultPropsValue(PROP_TYPES)
  };

  /**
   * 取得渲染內容
   */
  render() {

    // 渲染元素
    let style = this.createElementStyle(this.props, PROP_TYPES) + " header";
    return super.render(style);
  }
}

export default Header;

這樣的好處是顯而易見的:

簡化實現代碼提高可閱讀性

封裝共通處理提高可維護性

通過方法覆寫保持可擴展性

通過這幾篇,基礎組件的封裝處理應該說完了,接下來的幾篇打算說說復雜組件的實現。在完成所有組件的封裝后,還打算擴展一些復雜組件的功能(代碼丑,只能多實現些功能了。總之要和官方做成不一樣的/(ㄒoㄒ)/~~)。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80663.html

相關文章

  • React表單

    摘要:從服務端請求數據創建一個文件大胖分鐘前天氣不錯啊騷胖分鐘前出去玩啊老胖分鐘前去哪玩啊從服務端請求數據為了頁面的數據和服務端的保持聯系,設置每隔五秒向服務端發生一次請求在幫頂一下事件提交表單。。。。 React表單 首先,我們需要搭建一個React環境,用來實現效果: 先安裝React,這里我用的并不是最新版本的,所以需要選擇一個版本: jspm install react@0.14.0...

    Coding01 評論0 收藏0
  • react組件通信實現表單提交

    摘要:組件通信實現表單提交昨晚做了一個的例子,主要實現的是提交表單實現評論的功能,在做之前先簡單介紹一下。并稱為前端大框架,就目前來看,盡管發布了也在今年月份發布了,更不在話下,大家要是想學習的話可以去官網學習。 react組件通信實現表單提交 昨晚做了一個react的例子,主要實現的是提交表單實現評論的功能,在做之前先簡單介紹一下React。 showImg(https://segment...

    LoftySoul 評論0 收藏0
  • 玩轉 React)- 創造一個新 HTML 標簽

    摘要:屬性是一個組件的外部輸入。只會在開發模式下進行屬性類型檢查,當代碼進行生產發布后,為了減少額外的性能開銷,類型檢查將會被略過。某個類的實例枚舉,屬性值必須為其中的某一個值。屬性為一個數組,且數組中的元素必須符合指定類型。 在第二篇文章 《新型前端開發方式》 中有說到 React 有很爽的一點就是給我們一種創造 HTML 標簽的能力,那么今天這篇文章就詳細講解下 React 是如何提供這...

    soasme 評論0 收藏0
  • 玩轉 React)- 創造一個新 HTML 標簽

    摘要:屬性是一個組件的外部輸入。只會在開發模式下進行屬性類型檢查,當代碼進行生產發布后,為了減少額外的性能開銷,類型檢查將會被略過。某個類的實例枚舉,屬性值必須為其中的某一個值。屬性為一個數組,且數組中的元素必須符合指定類型。 在第二篇文章 《新型前端開發方式》 中有說到 React 有很爽的一點就是給我們一種創造 HTML 標簽的能力,那么今天這篇文章就詳細講解下 React 是如何提供這...

    dendoink 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<