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 サンプル コード

推薦する

CentOS 7.3 で Nginx 仮想ホストを設定する方法

実験環境最小限にインストールされた CentOS 7.3 仮想マシン基本環境を構成する1. ngin...

Vueでブラウザタイトルを動的に設定する方法の詳細な説明

目次ナンセンス文章最初ルーター/index.js 2番目1. プラグインをインストールする2.mai...

pt-heartbeat を使用して MySQL レプリケーションの遅延を監視する方法の詳細な説明

pt-ハートビートデータベースがマスターとスレーブ間で複製される場合、複製ステータスとデータ遅延は非...

MySQL最新バージョン8.0.17解凍版インストールチュートリアル

個人的にはインストール版よりも解凍版の方がインストールしやすいと思います。早速、解凍版のインストール...

MySQL 8.0.18 のインストールと設定方法のグラフィックチュートリアル

この記事は、参考のためにMySQL 8.0.18のインストールと設定のグラフィックチュートリアルを記...

JavaScript データ型変換の例 (他の型を文字列、数値型、ブール型に変換する)

序文データ型変換とは何ですか?フォームまたはプロンプトを使用して取得されるデフォルトのデータ型は文字...

chkconfig および systemctl コマンドを使用して Linux サービスを有効または無効にする方法

これは Linux 管理者にとって重要な (そして素晴らしい) トピックなので、誰もが Linux ...

MySQL の日付型の単一行関数コードの詳細な説明

MySQL の日付型単一行関数: CURDATE()またはCURRENT_DATE()は現在の日付を...

Ubuntu システムにおける Mysql ERROR 1045 (28000): ユーザー root@localhost へのアクセスが拒否される問題の解決方法

最初の方法: skip-grant-tables: 非常に便利なmysql起動パラメータ非常に便利な...

MySQL 8.0.19 インストール詳細チュートリアル (Windows 64 ビット)

目次MySQLを初期化するMySQL サービスをインストール + MySQL サービスを開始MySQ...

Flexレイアウトを使用してdiv内のサブ要素を垂直方向に中央揃えする例

1. Flex は Flexible Box の略で、「柔軟なレイアウト」を意味し、ボックス モデル...

ドラッグアンドドロップによる並べ替えの詳細を実現する js

目次1. はじめに2. 実装3. HTML ドラッグ アンド ドロップ API を使用しないのはなぜ...

CSS で縦書きテキスト配置を実装する方法 (概要)

HTML でのテキストのデフォルトの配置は水平ですが、特殊な場合にはテキストを垂直に配置する必要が...

Nginx でバージョン番号を隠す方法

Nginx はバージョン番号を非表示にする実稼働環境では、セキュリティ上の脆弱性の漏洩を避けるために...