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 のログレベルを調整する方法

推薦する

Logrotate は 2 時間ごとに Catalina.out ログローテーションを実装します

1. Logrotateツールの紹介Logrotate はログファイル管理ツールです。Linux に...

Mac での MySQL と Squel Pro の設定

Node.js の人気に応えて、最近、いくつかのサーバー側機能を実装するために Node.js を使...

JavaScript関数におけるこのポイントの問題の詳細な説明

このキーワードどのオブジェクトが関数を呼び出しますか? また、関数内の this はどのオブジェクト...

Linux での fuser コマンドの使用法の詳細な説明

説明する: fuser は、現在ディスク上のファイル、マウント ポイント、さらにはネットワーク ポー...

Windows オペレーティング システムでの Linux 仮想マシンのインストールと構成のチュートリアル

序文仕事では、Linux 環境で操作する必要があることがよくあります。ここでは、win10 システム...

JavaScript 配列 sort() メソッドの基本的な使い方と落とし穴

序文日常のコード開発では、配列のソートに関連する操作が多数あります。JavaScript では、so...

MySQL 全文あいまい検索 MATCH AGAINST メソッドの例

MySQL 4.x 以降では、全文検索 MATCH ... AGAINST モード (大文字と小文字...

CSS フロントエンドの知識ポイントのまとめ(必読)

1. CSS の概念: (カスケーディング スタイル シート)利点: 1. コンテンツとプレゼンテ...

Ember.js と Vue.js の詳細な比較

目次概要フレームワークを選択する理由は何ですか? js のエンバーEmber.js と Vue.js...

Ubuntu 20.04でLNMP環境を構築する方法

簡単な説明以前 Centos7 で構築し、その後個人開発環境として Ubuntu 20.04 を使っ...

グループ化されたクエリでのGROUP BYの使用とSQL実行順序の説明

SQL では、GROUP BY は SELECT の結果のデータをグループ化するために使用されます。...

MySql で SQL 実行プランをクエリするために explain を使用する方法

explain コマンドは、クエリ オプティマイザーがクエリの実行を決定した方法を確認する主な方法で...

MySQLデータクエリが多すぎるとOOMが発生するかどうかについての簡単な議論

目次サーバー層でのフルテーブルスキャンの影響InnoDB におけるフルテーブルスキャンの影響Inno...

Vue Elementのテーブルコンポーネントをカプセル化する方法

Vue コンポーネントをカプセル化する場合でも、機能コンポーネントをクロスファンクショナルに使用しま...