Reactベースのコンポーネントのカプセル化の実装手順

Reactベースのコンポーネントのカプセル化の実装手順

序文

多くの友人は、初めてコンポーネントをカプセル化しようとすると、私と同じように多くの問題に遭遇します。たとえば、他の人のコンポーネントには色属性があります。コンポーネントを使用するときは、コンポーネント ドキュメントに記述されている primary などの属性値を渡します。すると、このコンポーネントのフォント カラーは primary に対応する色になります。これはどのように行われるのでしょうか。また、他者によってカプセル化されたコンポーネントクラス名には、独自のプレフィックスが付きます。これはどのように対処しますか? すべての CSS クラス名にプレフィックスを追加する必要がありますか? これは面倒すぎます!

これらの質問について混乱している場合は、この記事を読んでください。

antd のディバイダ コンポーネントを参考にして、React ベースのコンポーネントをカプセル化する方法を説明し、上記の質問のいくつかに答えます。 どうぞじっくりお読みください。

antd はどのようにしてコンポーネントをカプセル化するのでしょうか?

倉庫住所

  • Antd リポジトリ アドレス: https://github.com/ant-design/ant-design
  • ディバイダーコンポーネントは、下の図に対応するディレクトリにあります(ここにコードをコピーします。興味がある場合は、リポジトリをクローンできます)。

ディバイダーコンポーネントのソースコード

antd のソースコードは TypeScript 構文を使用しているため、構文を理解していない学生は時間内に学習する必要があります。

'react' から * を React としてインポートします。
'classnames' から classNames をインポートします。
'../config-provider' から ConfigConsumer、ConfigConsumerProps } をインポートします。

エクスポートインターフェースDividerProps {
    prefixCls?: 文字列;
    タイプ: '水平' | '垂直';
    方向?: '左' | '右' | '中央';
    クラス名?: 文字列;
    子?: React.ReactNode;
    破線?: ブール値;
    スタイル?: React.CSSProperties;
    プレーン?: ブール値;
}

定数ディバイダー: React.FC<DividerProps> = props => (
    <ConfigConsumer>
        {({ getPrefixCls, 方向 }: ConfigConsumerProps) => {
            定数{
                prefixCls: カスタマイズPrefixCls、
                タイプ = '水平'、
                方向 = '中心'、
                クラス名、
                子供たち、
                破線、
                無地、
                ...レストプロップ
            } = プロパティ;
            const prefixCls = getPrefixCls('divider', customizePrefixCls);
            const orientationPrefix = orientation.length > 0 ? `-${orientation}` : 方向;
            const hasChildren = !!children;
            定数classString = classNames(
                プレフィックスCls、
                `${prefixCls}-${type}`、
                {
                    [`${prefixCls}-with-text`]: 子を持つ、
                    [`${prefixCls}-with-text${orientationPrefix}`]: 子を持ちます、
                    [`${prefixCls}-dashed`]: !!dashed,
                    [`${prefixCls}-p​​lain`]: !!プレーン,
                    [`${prefixCls}-rtl`]: 方向 === 'rtl',
                },
                クラス名、
            );
            戻る (
                <div className={classString} {...restProps} 役割="セパレーター">
                    {子供 && <span className={`${prefixCls}-inner-text`}>{子供}</span>}
                </div>
            );
        }}
    </ConfigConsumer>
);

デフォルトのディバイダをエクスポートします。

コンポーネントのプロパティを公開する方法

ソース コードで最初に目にするのは、次の内容です。これらのプロパティは、区切り線コンポーネントによって公開されるプロパティでもあります。 <Divider type='vertical' />のように type 属性を渡すことができるので、区切り線のスタイルは垂直の区切り線としてレンダリングされます。見覚えがありませんか?

export interface DividerProps { // インターフェースは TypeScript 構文です prefixCls?: string;
    type?: 'horizo​​ntal' | 'vertical'; // タイプを 2 つの値のうち 1 つのみに制限します orientation?: 'left' | 'right' | 'center';
    クラス名?: 文字列;
    子?: React.ReactNode;
    破線?: ブール値;
    スタイル?: React.CSSProperties;
    プレーン?: ブール値;
}

上記の属性では、className と style が比較的一般的な属性であることもわかりました。つまり、これらの属性は<Divider type='vertical' className='myClassName' style={{width: '1em'}} />のように使用できます。

統一されたクラス名プレフィックスを設定する方法

antd のコンポーネント クラス名には独自のプレフィックスant-があることはわかっていますが、これはどのように処理されるのでしょうか?引き続きソースコードを見てみましょう。

<ConfigConsumer>
    {({ getPrefixCls, 方向 }: ConfigConsumerProps) => {
        定数{
            prefixCls: カスタマイズPrefixCls、
            タイプ = '水平'、
            方向 = '中心'、
            クラス名、
            子供たち、
            破線、
            無地、
            ...レストプロップ
        } = プロパティ;
        const prefixCls = getPrefixCls('divider', customizePrefixCls);

ソース コードから、getPrefixCls メソッドによって生成された prefixCls を見つけます。次に、getPrefixCls メソッドのソース コードを見てみましょう。

エクスポートインターフェースConfigConsumerProps {
  ...
  getPrefixCls: (suffixCls?: 文字列、customizePrefixCls?: 文字列) => 文字列;
  ...
}

const defaultGetPrefixCls = (suffixCls?: 文字列、customizePrefixCls?: 文字列) => {
  if (customizePrefixCls) は customizePrefixCls を返します。

  suffixCls を返します ? `ant-${suffixCls}` : 'ant';
};

このとき生成されるクラス名プレフィックスがant-dividerであることは簡単にわかります

スタイルとクラス名の扱い方

カプセル化するコンポーネントには、事前に設定されたスタイルが必要です。スタイルはクラス名によって定義され、渡される属性値によってコンポーネントに追加するクラス名が決まるのですが、これはどのように実現されるのでしょうか。以下のソースコードを見てみましょう。

'classnames' から classNames をインポートします。

const クラス文字列 = クラス名(
    プレフィックスCls、
    `${prefixCls}-${type}`、
    {
        [`${prefixCls}-with-text`]: 子を持つ、
        [`${prefixCls}-with-text${orientationPrefix}`]: 子を持ちます、
        [`${prefixCls}-dashed`]: !!dashed,
        [`${prefixCls}-p​​lain`]: !!プレーン,
        [`${prefixCls}-rtl`]: 方向 === 'rtl',
    },
    クラス名、
);
戻る (
    <div className={classString} {...restProps} 役割="セパレーター">
        {子供 && <span className={`${prefixCls}-inner-text`}>{子供}</span>}
    </div>
);

classNames メソッド (classNames は複数のクラス名を処理する React のコンポーネントです) を通じてすべてのクラス名の定数を定義し、それを div 内の className 属性に渡すことがわかりました

実際、生成されたクラス名はant-divider-horizontalなので、このクラス名で CSS に定義されたスタイルが自然に有効になります。 className 属性と style 属性は{...restProps}を介して渡されます。

最後に、CSS スタイルコードがどのように記述されているかを見てみましょう。

ディバイダーコンポーネントスタイルのソースコード

antd コンポーネントのスタイルは Less で記述されています。Less 構文に慣れていない学生は、Less 構文について学ぶ必要があります。

@import '../../style/themes/index';
@import '../../style/mixins/index';

@divider-prefix-cls: ~'@{ant-prefix}-divider'; // これは、前述のクラス名プレフィックスに対応していることがわかります。@{divider-prefix-cls} {
  .reset-component();

  上境界線: @border-width-base solid @divider-color;

  &-vertical { // ここでの完全なクラス名は実際には ant-divider-vertical であり、これは type 属性値が vertical position: relative の場合の区切りコンポーネントに対応するスタイルです。
    上: -0.06em;
    表示: インラインブロック;
    高さ: 0.9em;
    マージン: 0 8px;
    垂直位置合わせ: 中央;
    上境界線: 0;
    左境界線: @border-width-base solid @divider-color;
  }

  &-水平{
    ディスプレイ: フレックス;
    クリア: 両方;
    幅: 100%;
    最小幅: 100%; 
    マージン: 24px 0;
  }

  &-水平&-テキスト付き{
    ディスプレイ: フレックス;
    マージン: 16px 0;
    色: @heading-color;
    フォントの太さ: 500;
    フォントサイズ: @font-size-lg;
    空白: ラップなし;
    テキスト配置: 中央;
    上境界線: 0;
    境界線の上部の色: @divider-color;

    &::前に、
    &::後 {
      位置: 相対的;
      上位: 50%;
      幅: 50%;
      border-top: @border-width-base solid transparent;
      // Chrome は `border-top` 内の `inherit` を受け入れません
      境界線上部の色: 継承;
      下境界線: 0;
      変換: translateY(50%);
      コンテンツ: '';
    }
  }

  &-horizo​​ntal&-with-text-left {
    &::前に {
      上位: 50%;
      幅: @divider-orientation-margin;
    }

    &::後 {
      上位: 50%;
      幅: 100% - @divider-orientation-margin;
    }
  }

  &-horizo​​ntal&-with-text-right {
    &::前に {
      上位: 50%;
      幅: 100% - @divider-orientation-margin;
    }

    &::後 {
      上位: 50%;
      幅: @divider-orientation-margin;
    }
  }

  &-内部テキスト{
    表示: インラインブロック;
    パディング: 0 @divider-text-padding;
  }

  &-破線 {
    背景: なし;
    境界線の色: @divider-color;
    境界線スタイル: 破線;
    境界線の幅: @border-width-base 0 0;
  }

  &-水平&-テキスト付き&-破線 {
    上境界線: 0;

    &::前に、
    &::後 {
      境界線スタイル: 破線 なし なし;
    }
  }

  &-垂直&-破線 {
    境界線の幅: 0 0 0 @境界線の幅のベース;
  }

  &プレーン&テキスト付き{
    色: @テキストカラー;
    フォントの太さ: 標準;
    フォントサイズ: @font-size-base;
  }
}

@import './rtl';

このように、コンポーネントをカプセル化する方法やポイントについても、大まかな理解は得られたと思います。ここでの ConfigConsumer の定義や使い方など、ソースコードには学ぶ価値のある箇所がまだまだたくさんあります。興味のある学生同士、ぜひコミュニケーションをとってみてください。

Reactベースのカプセル化コンポーネントの実装手順についてはこれで終了です。Reactカプセル化コンポーネントの関連コンテンツについては、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 最も単純な ErrorBoundary コンポーネントをカプセル化して、React 例外を処理する
  • React Form コンポーネント実装のカプセル化
  • React チュートリアル: Portal の再利用可能なコンポーネントをカプセル化する方法
  • React Native 通知メッセージの垂直カルーセル コンポーネントのカプセル化
  • React に基づいてコンポーネントをカプセル化する方法を知っていますか?

<<:  SQL 挿入文の書き方の説明

>>:  Docker で nginx のログレベルを調整する方法

推薦する

Linux ファイアウォールの状態確認方法の例

Linuxファイアウォールの状態を確認する方法1. 基本操作 # ファイアウォールのステータスを表示...

入力ボックスのプレースホルダーテキストのデフォルトの色を変更する -webkit-input-placeholder メソッド

HTML5 では、入力用のネイティブ プレースホルダー属性が追加されており、これは高度なブラウザでサ...

Centos8.2 クラウド サーバー環境に Tomcat8.5 をインストールするための詳細なチュートリアル

Tomcatをインストールする前に、まずJDK環境をインストールしてくださいLinux サーバー上で...

インターネットウェブデザインにおけるバイオニックデザインの簡単な紹介

バイオニックデザインといえば、飛行機の発明、ドバイのブルジュ・アル・アラブ、平泳ぎなどを思い浮かべる...

製品を選択した後、右下隅に√記号を表示するための純粋なCSS

おすすめの記事: CSS 疑似クラスの右下隅をクリックすると、選択を示すチェックマークが表示されます...

MySQLで日付と時刻を照会する方法

序文:プロジェクト開発では、一部のビジネス テーブル フィールドで日付と時刻の型が使用されることが多...

htmlはハイパーリンク付きの新しいウィンドウを開き、ウィンドウのプロパティを制御できます。

1. HTMLハイパーリンクによって開かれるウィンドウのサイズコードをコピーコードは次のとおりです...

ミニプログラムはミニプログラムクラウドを使用してWeChatの支払い機能を実装します

目次1. WeChat Payを開く1.1 アフィリエイト加盟店番号1.2 加盟店番号を追加する1....

Dockerコンテナ間で通信する3つの方法

Docker コンテナは互いに分離されており、相互にアクセスできないことは誰もが知っていますが、依存...

流れと動的なライン効果を実現する純粋なCSSコード

アイデア:外側のボックスは背景を設定し、内側のボックスは背景の幅と高さを設定し、ボックスを動かすアニ...

要素ツリーコントロールは、ドロップダウンメニューとアイコンを統合します(ツリー+ドロップダウン+入力)

目次要件:実装手順:この記事では主に以下について説明します: カスタムツリーコントロール<el...

Vue 実践における実用的な小さな魔法のまとめ

初回の読み込みを高速化できるルートの遅延読み込みをどうして忘れられるでしょうか?ルーティングの遅延読...

CSS3はグラフィックの落下アニメーション効果を実現します

まずは効果を確認実装コード <div class="box box1"&g...

Ubuntuがネットワークに接続できない場合の解決策

仮想マシン内の Ubuntu がネットワークに接続できない場合の効果的な解決策: 1. Ubuntu...

Helloダイアログボックスのデザイン体験の共有

「どうしたの?」特定の種類のダイアログ ボックスに慣れていない限り、ダイアログ ボックスが表示された...