序文多くの友人は、初めてコンポーネントをカプセル化しようとすると、私と同じように多くの問題に遭遇します。たとえば、他の人のコンポーネントには色属性があります。コンポーネントを使用するときは、コンポーネント ドキュメントに記述されている primary などの属性値を渡します。すると、このコンポーネントのフォント カラーは primary に対応する色になります。これはどのように行われるのでしょうか。また、他者によってカプセル化されたコンポーネントクラス名には、独自のプレフィックスが付きます。これはどのように対処しますか? すべての CSS クラス名にプレフィックスを追加する必要がありますか? これは面倒すぎます! これらの質問について混乱している場合は、この記事を読んでください。 antd のディバイダ コンポーネントを参考にして、React ベースのコンポーネントをカプセル化する方法を説明し、上記の質問のいくつかに答えます。 どうぞじっくりお読みください。 antd はどのようにしてコンポーネントをカプセル化するのでしょうか?倉庫住所
ディバイダーコンポーネントのソースコード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}-plain`]: !!プレーン, [`${prefixCls}-rtl`]: 方向 === 'rtl', }, クラス名、 ); 戻る ( <div className={classString} {...restProps} 役割="セパレーター"> {子供 && <span className={`${prefixCls}-inner-text`}>{子供}</span>} </div> ); }} </ConfigConsumer> ); デフォルトのディバイダをエクスポートします。 コンポーネントのプロパティを公開する方法ソース コードで最初に目にするのは、次の内容です。これらのプロパティは、区切り線コンポーネントによって公開されるプロパティでもあります。 export interface DividerProps { // インターフェースは TypeScript 構文です prefixCls?: string; type?: 'horizontal' | 'vertical'; // タイプを 2 つの値のうち 1 つのみに制限します orientation?: 'left' | 'right' | 'center'; クラス名?: 文字列; 子?: React.ReactNode; 破線?: ブール値; スタイル?: React.CSSProperties; プレーン?: ブール値; } 上記の属性では、className と style が比較的一般的な属性であることもわかりました。つまり、これらの属性は 統一されたクラス名プレフィックスを設定する方法antd のコンポーネント クラス名には独自のプレフィックス <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'; }; このとき生成されるクラス名プレフィックスが スタイルとクラス名の扱い方カプセル化するコンポーネントには、事前に設定されたスタイルが必要です。スタイルはクラス名によって定義され、渡される属性値によってコンポーネントに追加するクラス名が決まるのですが、これはどのように実現されるのでしょうか。以下のソースコードを見てみましょう。 'classnames' から classNames をインポートします。 const クラス文字列 = クラス名( プレフィックスCls、 `${prefixCls}-${type}`、 { [`${prefixCls}-with-text`]: 子を持つ、 [`${prefixCls}-with-text${orientationPrefix}`]: 子を持ちます、 [`${prefixCls}-dashed`]: !!dashed, [`${prefixCls}-plain`]: !!プレーン, [`${prefixCls}-rtl`]: 方向 === 'rtl', }, クラス名、 ); 戻る ( <div className={classString} {...restProps} 役割="セパレーター"> {子供 && <span className={`${prefixCls}-inner-text`}>{子供}</span>} </div> ); classNames メソッド (classNames は複数のクラス名を処理する React のコンポーネントです) を通じてすべてのクラス名の定数を定義し、それを div 内の className 属性に渡すことがわかりました。 実際、生成されたクラス名は 最後に、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%); コンテンツ: ''; } } &-horizontal&-with-text-left { &::前に { 上位: 50%; 幅: @divider-orientation-margin; } &::後 { 上位: 50%; 幅: 100% - @divider-orientation-margin; } } &-horizontal&-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をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: Docker で nginx のログレベルを調整する方法
Linuxファイアウォールの状態を確認する方法1. 基本操作 # ファイアウォールのステータスを表示...
HTML5 では、入力用のネイティブ プレースホルダー属性が追加されており、これは高度なブラウザでサ...
Tomcatをインストールする前に、まずJDK環境をインストールしてくださいLinux サーバー上で...
バイオニックデザインといえば、飛行機の発明、ドバイのブルジュ・アル・アラブ、平泳ぎなどを思い浮かべる...
おすすめの記事: CSS 疑似クラスの右下隅をクリックすると、選択を示すチェックマークが表示されます...
序文:プロジェクト開発では、一部のビジネス テーブル フィールドで日付と時刻の型が使用されることが多...
1. HTMLハイパーリンクによって開かれるウィンドウのサイズコードをコピーコードは次のとおりです...
目次1. WeChat Payを開く1.1 アフィリエイト加盟店番号1.2 加盟店番号を追加する1....
Docker コンテナは互いに分離されており、相互にアクセスできないことは誰もが知っていますが、依存...
アイデア:外側のボックスは背景を設定し、内側のボックスは背景の幅と高さを設定し、ボックスを動かすアニ...
目次要件:実装手順:この記事では主に以下について説明します: カスタムツリーコントロール<el...
初回の読み込みを高速化できるルートの遅延読み込みをどうして忘れられるでしょうか?ルーティングの遅延読...
まずは効果を確認実装コード <div class="box box1"&g...
仮想マシン内の Ubuntu がネットワークに接続できない場合の効果的な解決策: 1. Ubuntu...
「どうしたの?」特定の種類のダイアログ ボックスに慣れていない限り、ダイアログ ボックスが表示された...