React antd タブの切り替えによりサブコンポーネントが繰り返し更新される

React antd タブの切り替えによりサブコンポーネントが繰り返し更新される

説明する:

Tabs コンポーネントが切り替わると、TabPane に含まれる同じサブコンポーネントが繰り返しレンダリングされます。次に例を示します。

<タブ
 アクティブキー={タブアクティブキー}
 onChange={(キー: 文字列) => this.changeTab(キー)}
 タイプ="カード"
>
  <TabPane tab={"外部認証"} key="/authed-by-me">
    <AuthedCollections
        コレクションタイプ={this.collectionType}
     />
  </タブペイン>
  <TabPane tab={"権限を申請"} key="/authed-to-me">
    <AuthedCollections
      コレクションタイプ={this.collectionType}
     />
  </タブペイン>
</タブ>


changeTab = (キー: 文字列) => {
 this.collectionType = key === '/authed-by-me' ? CollectionEnums.AUTHED_TO_GRANT : CollectionEnums.AUTHED_TO_APPLY;
 this.setState({
  tabActiveKey: キー
 })
};

分析:

Tabs の onChange リスナー関数 changeTab で setState を呼び出し、ページが再レンダリングされるようにします。 Antd の戦略は、現在のものだけをレンダリングすることです。ユーザーが切り替えても、以前にレンダリングされたノードは削除されません。なので、切り替えるためのクリック数は徐々に増えていきます。これは、マウント フェーズ中にユーザーが非同期リクエストを呼び出して、切り替え時にレンダリングが繰り返されるのを防ぐためです。そのため、上位レイヤーが更新されるにつれてレンダリング回数も増加していくことが予想されます。

解決:

タブが切り替わるたびに、Reactの条件付きレンダリングを使用して、前のページをDomツリーから移動します。

<タブ
 アクティブキー={タブアクティブキー}
 onChange={(キー: 文字列) => this.changeTab(キー)}
 タイプ="カード"
>
 <TabPane tab={"外部認証"} key="">
 {
 this.collectionType === CollectionEnums.AUTHED_TO_GRANT &&
 <AuthedCollections
 コレクションタイプ={this.collectionType}
 />
 }
 </タブペイン>
 <TabPane tab={"権限を申請"} key="/authed-to-me">
 {
 this.collectionType === CollectionEnums.AUTHED_TO_APPLY &&
 <AuthedCollections
 コレクションタイプ={this.collectionType}
 />
 }
 </タブペイン>
</タブ>

Antdタブの現在のページが前後に切り替わり、フォームデータはクリアされません(またはクリアされます)

フォームをクリアする方法はthis.props.form.resetFields();

しかし、この記事では主に

display:none を柔軟に使用すると、切り替え時にフォーム データが再レンダリングされ、setState によってクリアされることを回避できます (つまり、フォームをクリアせずにタブ項目を切り替える)。

クエリ領域

クエリ領域*/
    <div className="検索フォームエリア">
     {
      <div style={{ display: activeKey === '1' ? 'block' : 'none' }}><SearchFieldForm // プロジェクト角度 ref={(form) => this.ProjSearchForm = form}
       送信Fuc={this.getProjPage}
       fieldsData={projSearchData}
       列番号={4}
       diyItemLayout={{ labelCol: { span: 4 }, wrapperCol: { span: 17 } }}
      // moreSearchData={moreSearchData}
      </div>
     }
     {
      <div style={{ display: activeKey === '2' ? 'block' : 'none' }}>< SearchFieldForm // 製品角度 ref={(form) => this.PrdSearchForm = form}
       送信Fuc={this.getProjPage}
       fieldsData={prdSearchData}
       列番号={4}
       diyItemLayout={{ labelCol: { span: 4 }, wrapperCol: { span: 17 } }}
      </div>
     }
    </div>

リストエリア

 {/* リストエリア */ 
        <div style={{ height: tableHeight + 100 }} className='myProjTable'> 
          <タブ defaultActiveKey="1" onChange={this.handleTabsChange}> 
            <TabPane tab="プロジェクト角度" key="1" style={{ backgroundColor: '#fff' }}> 
              <カスタムテーブル 
                行キー='プロジェクトID'
                サイズ="小"
                スタイル={{ 高さ: テーブルの高さ }}
                columns={列}
                テーブルデータ={プロジェクトテーブルデータ}
                展開された行のレンダリング = {this.expandedRowRender}
                ページネーション={ページネーション}
                handleTableChange={this.handleTableChange}
                スクロール={{ y: テーブルスクロール高さ、x: 1660 }}
                テーブル行選択 = {this.tableRowSelection}
              />
            </タブペイン>
            <TabPane tab="製品アングル" key="2" style={{ backgroundColor: '#fff' }}>
              <カスタムテーブル
                行キー="プロジェクトID"
                サイズ="小"
                スタイル={{ 高さ: テーブルの高さ }}
                列={列Prd}
                テーブルデータ={prdテーブルデータ}
                handleTableChange={this.handleTableChange}
                ページネーション={ページネーション}
                スクロール={{ y: テーブルスクロール高さ、x: 1800 }}
                テーブル行選択 = {this.tableRowSelection}
              />
            </タブペイン>
          </タブ>
        </div>

React antd タブの切り替えによりサブコンポーネントが繰り返し更新される問題についてはこれで終わりです。antd タブの繰り返し更新に関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • ReactはTaobaoのタブ中央切り替え効果に似たサンプルコードを実装します
  • タブコンポーネントを動的に切り替えるReactネイティブメソッド
  • React コンポーネントでイベントパラメータを渡してタブ切り替えを実装するためのサンプルコード
  • ReactJS を使用して、タブページの切り替え、メニューバーの切り替え、アコーディオンの切り替え、プログレスバーの効果を実装します。
  • React 手書きタブ切り替え問題

<<:  OpenSSL を使用した Kubernetes 証明書の生成の概要

>>:  動的および静的分離を実装するための Nginx サンプル コード

推薦する

HTML CSS3は画像表示効果を引き伸ばさない

1. transform 属性を使用して、画像を拡大せずに表示します (パスの問題は必要に応じて修正...

MySQL での SQL モードの表示と設定の詳細な説明

MySQL での SQL モードの表示と設定MySQL はさまざまなモードで実行でき、さまざまなシナ...

SQLのさまざまな結合サマリーの詳細な説明

SQL 左結合、右結合、内部結合、自然結合 さまざまな結合の概要SQL には、左結合、右結合、内部結...

js キャンバスはスライダー検証を実現します

この記事の例では、スライダー検証を実装するためのjsキャンバスの具体的なコードを参考までに共有してい...

シンプルなウェブデザインコンセプトのカラーマッチング

(I)ウェブページのカラーマッチングの基本概念(1)白黒の言葉は永遠のテーマです。誰もそれを悪く言う...

M1 チップに MySQL 8.0 データベースをインストールする方法 (画像とテキスト)

1. ダウンロードまず、MySQLの国内ミラーをお勧めします。特に速いわけではありませんが、それで...

CentOS6 アップグレード glibc 操作手順

目次背景glibc 2.14をコンパイルするソフトリンクを変更するやっと背景テスト環境には Cent...

CSS3 @mediaの基本的な使い方のまとめ

//文法: @media mediatype and | not | only (メディア機能) ...

Linuxでpyファイルを直接実行する方法

1. まずファイルを作成します(ファイルを配置するディレクトリにcdします) myTest.py を...

Linux (Ubuntu 18.04) に vim エディタをインストールする方法

デスクトップ システムをダウンロードするには、Ubuntu の公式 Web サイト (https:/...

MySQL 並列レプリケーションの簡単な分析

01 並列レプリケーションの概念MySQL のマスター スレーブ レプリケーション アーキテクチャで...

最もよく使われるHTMLエスケープシーケンス

HTML では、<、>、& などは特別な意味を持ち (<、> はリン...

docker を使用して crownblog プロジェクトを Alibaba Cloud にデプロイする方法

フロントエンドプロジェクトのパッケージ化.env.productionを見つけて、自分のIPまたはド...

Vue2.x と Vue3.x のルーティングフックの違いの詳細な説明

目次vue2.xプレコンセプト:ルーティングフックのカテゴリルーティングとコンポーネントの概念(フッ...

HTML 要素 (タグ) とその使用法

a : ハイパーリンクの開始位置または宛先位置を示します。頭字語: 単語の最初の文字からなる略語を示...