序文多くの友人は、初めてコンポーネントをカプセル化しようとすると、私と同じように多くの問題に遭遇します。たとえば、他の人のコンポーネントには色属性があります。コンポーネントを使用するときは、コンポーネント ドキュメントに記述されている 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 のログレベルを調整する方法
1. Logrotateツールの紹介Logrotate はログファイル管理ツールです。Linux に...
Node.js の人気に応えて、最近、いくつかのサーバー側機能を実装するために Node.js を使...
このキーワードどのオブジェクトが関数を呼び出しますか? また、関数内の this はどのオブジェクト...
説明する: fuser は、現在ディスク上のファイル、マウント ポイント、さらにはネットワーク ポー...
序文仕事では、Linux 環境で操作する必要があることがよくあります。ここでは、win10 システム...
序文日常のコード開発では、配列のソートに関連する操作が多数あります。JavaScript では、so...
MySQL 4.x 以降では、全文検索 MATCH ... AGAINST モード (大文字と小文字...
1. CSS の概念: (カスケーディング スタイル シート)利点: 1. コンテンツとプレゼンテ...
目次概要フレームワークを選択する理由は何ですか? js のエンバーEmber.js と Vue.js...
簡単な説明以前 Centos7 で構築し、その後個人開発環境として Ubuntu 20.04 を使っ...
SQL では、GROUP BY は SELECT の結果のデータをグループ化するために使用されます。...
explain コマンドは、クエリ オプティマイザーがクエリの実行を決定した方法を確認する主な方法で...
目次サーバー層でのフルテーブルスキャンの影響InnoDB におけるフルテーブルスキャンの影響Inno...
コードをコピーコードは次のとおりです。 <html> <本文> <?p...
Vue コンポーネントをカプセル化する場合でも、機能コンポーネントをクロスファンクショナルに使用しま...