いくつかのプロジェクトのメンテナンスを引き継ぐ必要があるため、チームのテクノロジー スタックは最近 Vue から React に切り替わりました。React 初心者として、またソース コードを通じて常に新しいことを学ぶのが好きなので、有名なプロジェクト antd のソース コードを読んで、React の使い方を学ぶことにしました。 ソースコードを読んでいると、多くのコンポーネントが React.cloneElement API を使用していることがわかりました。名前から何をするかは推測できましたが、具体的な機能はわかりませんでした。次に、公式ドキュメントを読みましたが、その機能は明確に説明されていましたが、どのようなシナリオで使用する必要があるのかはわかりませんでした。そこで、ドキュメントの説明に基づいて、ソースコードの使用と組み合わせ、Google と stackoverflow に焦点を当てて、いくつかの使用シナリオをまとめました。 cloneElementの役割React.cloneElement() で、 要素、 [小道具], [...子供たち] ) まず、この API の公式ドキュメントをご覧ください。
総括する:
使用シナリオ上記の定義に従って、さまざまなシナリオで必要に応じてこの API を使用できます。 新しい小道具を追加する共通コンポーネントを作成するときに、内部ロジックに従って各子要素に異なるクラス名を追加する必要があります。このとき、 必要に応じて複数の 定数MyTimeline = () => { 戻る ( <タイムライン> <タイムラインアイテム>2020-06-01</タイムラインアイテム> <タイムラインアイテム>2020-06-08</タイムラインアイテム> <タイムラインアイテム>2020-07-05</タイムラインアイテム> </タイムライン> ) } // タイムライン内のロジックは次のようになります。import class from 'classnames'; const タイムライン = props => { // ... // ... React のプロパティを count 要素に追加します。 const items = React.children.map(props.children, (item, index) => { React.cloneElement(item, { を返す クラス名: クラス([ アイテム.props.className、 'タイムライン項目'、 インデックス === カウント - 1 ? 'タイムライン項目最後' : '' ]) }) } <div className={'timeline'}>{ items }</div> を返します。 } クラスSwitchはReact.Componentを拡張します。 与える() { 戻る ( <ルーターコンテキスト.コンシューマー> {コンテキスト => { invariant(context, "<Switch> を <Router> の外部で使用しないでください"); const location = this.props.location || context.location; let 要素、一致; // React.Children.toArray().find() の代わりに React.Children.forEach を使用します // ここでtoArrayはすべての子要素にキーを追加するので、 // 同じものをレンダリングする2つの <Route> のアンマウント/再マウントをトリガーします // 異なる URL にあるコンポーネント。 React.Children.forEach(this.props.children, 子 => { マッチ == null && React.isValidElement(child) の場合 { 要素 = 子; 定数パス = child.props.path || child.props.from; 一致 = パス ? matchPath(location.pathname, { ...child.props, path }) : コンテキストに一致します。 } }); リターンマッチ React.cloneElement(要素、{場所、計算されたMatch:一致}) : ヌル; }} </ルーターコンテキスト.コンシューマー> ); } } プロップを変更するイベント複数の const Tab = props => { const { onClick } = プロパティ; const tabPanes = React.children.map(props.children, (tabPane, index) => { const ペインクリック = () => { onClick && onClick(インデックス); tabPane.props?.onClick(); } React.cloneElement(tabPane, { を返します。 onClick: ペインクリック、 }) }) <div>{ tabPanes }</div> を返します。 } カスタムスタイル
// 簡潔にするために、ここではマウス イベントは省略します。 const FollowMouse = props => { const { コンテンツ } = props; const customContent = React.isValidElement ? コンテンツ: <span>{ コンテンツ }</span> 定数 getOffset = () => { 戻る { 位置: '絶対'、 上: ..., 左: ...、 } } const renderContent = React.cloneElement(custonContent, { スタイル: { ...オフセット取得() } }) <div>{renderContent() }</div> を返します。 } キーを追加要素のリストを作成するときに、 const ComponentButton = props => { const { addonAfter, children } = props; const button = <button key='button'>{ children }</button> const list = [button, addonAfter ? React.cloneElement(addonAfter, { key: 'button-addon' } : null) <div>{リスト} <div> を返す } 要約する複雑なコンポーネントを開発する場合、必要に応じて子コンポーネントにさまざまな機能や表示効果を追加することがよくあります。React もちろん、React の強力な組み合わせモードのおかげで、これは 以上がReact.cloneElementの使い方の詳しい説明の内容です。React.cloneElementの使い方についてさらに詳しく知りたい方は、123WORDPRESS.COM内の他の関連記事もぜひご覧ください! 以下もご興味があるかもしれません:
|
<<: MySQL 5.5.56 バージョン (バイナリ パッケージ インストール) カスタム インストール パス ステップ レコード
>>: MySQL のバイナリおよび varbinary データ型の詳細な説明
ブラウザウィンドウの中央に要素を配置する方法まず、コード ブロックを示します。すでにコードを理解して...
この記事では、Web ページを作成する前に確認すべき、いわゆる仕様をいくつかまとめました。皆様のお役...
1. はじめにtr はテキストの一部を変換または削除するために使用されます。 tr は transl...
この記事の内容: ページ中空マスクレイヤー、ページ中空マスクガイドレイヤー、画像中空マスク通常のマス...
React の経験がある人なら、コンポーネントインスタンスオブジェクトや DOM オブジェクトを取得...
この記事では、写真の自動再生効果を実現するためのJSの具体的なコードを参考までに紹介します。具体的な...
目次1.1. IP経由のコンテナ間のネットワークアクセス1.2. コンテナ名またはコンテナIDによる...
前の章では、1 つのテーブルからデータを読み取る方法を学習しました。これは比較的簡単ですが、実際のア...
この記事では、テーブルを動的に読み込み、削除するためのJavaScriptの具体的なコードを参考まで...
Web ページを作成するときに、クールでスムーズなドロップダウン メニューが必要になることがあります...
目次1. デバッグ対象2. WebSocketの機能3. ソケット接続を確立する3.1 部屋の作成方...
バントリストコンポーネントをスクロールするときに、スクロールバーの位置が保持されます。これは、kee...
オープンソース ソフトウェアである Apache は、最も広く使用されている Web アプリケーショ...
文字列を動的に連結する場合、文字連結を使用することが多いです。次のような連結の引用符の意味がわかりま...
dockerをインストールすると、通常はdockerユーザーグループが作成されます。ステップ2: 現...