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

推薦する

Vue の計算プロパティとプロパティリスニングについての簡単な説明

目次1. 計算プロパティ構文: 1. 省略形:文法: 2. 文章を完成させる: 2. モニタリング(...

mysql5.7.19 解凍版の詳細なインストール チュートリアル (純粋なクラックされた中国語版 SQLYog を使用)

Mysql5.7.19バージョンは今年リリースされた新しいバージョンです。最近のMySQLのバージ...

24 の実用的な JavaScript 開発のヒント

目次1.配列を初期化する2. 配列の合計、最大値、最小値3. エラー値をフィルタリングする4. 論理...

Bツリーの特性の紹介

B ツリーは一般的なデータ構造です。彼と一緒にB+ツリーがあります。ここで、概念を明確にする必要があ...

HTML+CSS ボックスモデルの例 (円、半円など) 「border-radius」はシンプルで使いやすい

多くの友人は、フロントエンドを学習するときに、ボックス モデルがデフォルトで正方形であることに気付き...

エラー 1045 (28000): ユーザー ''root''@''localhost'' のアクセスが拒否されました (パスワード使用: YES) 実用的な解決策

昨日はデータベースへの接続に問題はありませんでしたが、今日はデータベースへの接続時にこのエラーが報告...

CentOS7 は rpm パッケージを使用して mysql 5.7.18 をインストールします

例示するこの記事は、2017 年 5 月 20 日に MySQL-5.7.18 を使用して作成されま...

ユニークインデックスの S ロックと X ロックによる MySQL デッドロック ルーチンの理解

「初心者向けソースコードからの MySQL デッドロック問題の理解」では、MySQL ソースコードを...

Maven モードで Tomcat ソースコードを実行する方法

序文最近、Tomcat の起動プロセスを分析していました。Tomcat のソース コードはアイデア次...

HTML Web ページ リスト タグ学習チュートリアル

HTML Web ページ リスト タグの学習チュートリアル。 HTML ページでは、リストはアウトラ...

ウェブページ内のFlash SWFファイルを変更する方法

これは多くの人が遭遇した問題だと思います。実際、Web ページから FLASH をダウンロードして修...

Javascript 共通高階関数の詳細

目次1. 一般的な高階関数1.1、フィルター1.2、地図1.3、減らすHigher Order fu...

MySQL ストレステストツール Mysqlslap の使用

1. MySQL独自のストレステストツールMysqlslap mysqlslap は、mysql に...

MySQLは、統計クエリを最適化するために、sum、case、whenを巧みに使用します。

私は最近、会社で統計レポートの開発に関わるプロジェクトに取り組んでいました。データの量が比較的多かっ...

VueにおけるAxios非同期通信の詳細な説明

1. まず、インタラクティブに使用するための .json ファイルを作成します。json データ形式...