vue+elementUI で埋め込みテーブルを実装する方法の例

vue+elementUI で埋め込みテーブルを実装する方法の例

大学 4 年生のときのインターンシップ中に、表内のデータの番号をクリックすると、そのデータの下に新しい表が表示されるという特別な要件に遭遇しました。この要件は、element UI の公式ドキュメントでも取り上げられています。以下は、他のブログ (ブログのアドレスが見つかりません) と element UI を参考にした最終的な実装効果です。

レンダリング

会社のパソコンが遅いからなのか、録画したモーショングラフィックスがカクカクするのはソフトウェアの問題なのかは分かりませんが、実際の操作ではカクカクしません。

ここに画像の説明を挿入

コード:

ページ表示コード:

メインコードは<el-table-column type="expand" width="1" >です。
type="expand"公式説明:
通過設置type="expand" 和Scoped slot 可以開啟展開行功能,el-table-column 的模板會被渲染成為展開行的內容,展開行可訪問的屬性與使用自定義列模板時的Scoped slot 相同。
最後に、 el-table-column type="expand"width="1"に設定することで、表示される矢印アイコンが非表示になります。

コード全体のフローは次のようになります。
データ テーブルはメイン テーブルとサブ テーブルに分かれており、ページが最初に読み込まれると、メイン テーブルのデータ (つまり、メイン テーブルと呼ばれる通常のテーブル データ テーブル) が表示されます。メイン テーブルのデータ行のナビゲーション名をクリックすると、クリック イベントtoogleExpand()がトリガーされます。このイベントの主な機能は、クリックされたデータの ID に応じてバックグラウンドで対応するサブテーブル データを検索し、それをフロントエンドに返し、最終的にフロントエンドで表示することです。
このプロセスで注目すべき点は、対応するデータを取得した後、サブテーブル データをメイン テーブル データに 1 つずつバインドする方法です。
ここでは、メイン テーブル ID をキーとして、サブ テーブル データを値として、Map を使用して実装します。

// マップ構造を使用して翻訳リストを保存します this.WebsiteLangMap.set(id,response.rows)

この時点ではまだ問題が残っています。
ページが読み込まれたばかりのときは、対応する埋め込みテーブルを開くための最初のクリックにはデータがありません。2 回目に開いたときにのみデータがあります。
テーブルが初めてレンダリングされるとき、保存したサブテーブル データのマップにはデータがないため、最初のクリックではデータが表示されません (データなしでレンダリングする方法)。取得するデータは、クリック イベントtoogleExpand()がトリガーされた後に要求されたデータです。つまり、データはレンダリング後にのみ利用可能になります。当初は、 data変更をリアルタイムでリッスンしてページをレンダリングできるリスナーのようなものだと思っていましたが、それはできませんでした。
解決策は、 el-tableの key 属性を制御し、サブテーブル データが変更されたときに key 値を変更することです。

this.websiteLangTableKey = !this.websiteLangTableKey;

以下はコアコードです。

<el-テーブル 
      v-loading="読み込み中" 
      :data="ウェブサイトリスト" 
      @selection-change="選択変更処理"
      ref="テーブル"
      キー="ウェブサイトテーブル"
      行キー="id"
      スタイル="幅: 100%; 最大ボトム: 20px;"
      国境
    >
      <el-table-column type="selection" width="55" align="center" />
      <!-- <el-table-column :label="td('主キー')" align="center" prop="id" /> -->
      <el-table-column :label="td('親ナビゲーション')" align="center" prop="parentId" />
      <el-table-column :label="td('ナビゲーション名')" align="center" prop="barName" >
        <テンプレート スロット スコープ="スコープ" >
          <el-link type="primary" :underline="false" @click="toogleExpand(scope.row)" >
            {{scope.row.barName}}
          </el-link>
        </テンプレート>
      </el-table-column>
      <el-table-column :label="td('リンクですか')" align="center" prop="isLink" />
      <el-table-column :label="td('リンクアドレス')" align="center" prop="url" />
      <el-table-column :label="td('作成日')" align="center" prop="createTime" />
      <el-table-column :label="td('ユーザーの作成')" align="center" prop="createBy" />
      <el-table-column :label="td('更新時間')" align="center" prop="updateTime" />
      <el-table-column :label="td('ユーザーの更新')" align="center" prop="updateBy" />
      <el-table-column :label="td('備考')" align="center" prop="備考" />
      <el-table-column :label="td('操作')" align="center" width="130" class-name="small-padding fixed-width" fixed="right">
        <テンプレート スロット スコープ="スコープ">
          <el-ボタン
            サイズ="ミニ"
            タイプ="テキスト"
            アイコン="el-icon-edit"
            @click="handleUpdate(scope.row)"
            v-hasPermi="['cms:website:edit']"
          >{{td("変更")}} </el-button>
          <el-ボタン
            サイズ="ミニ"
            タイプ="テキスト"
            アイコン="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['cms:website:remove']"
          >{{td("削除")}}</el-button>
        </テンプレート>
      </el-table-column>

      <el-table-column type="expand" width="1" >
        <テンプレート スロット スコープ="スコープ">
          <el-テーブル 
            v-loading="読み込み中" 
            スタイル="幅: 100%"
            行キー="langId"
            :key="ウェブサイト言語テーブルキー"
            :data="WebsiteLangMap.get(スコープ行ID)"
            クラス="テーブル内テーブル"
          >
            <!-- <el-table-column :label="td('ID 主キー')" align="center" prop="langId" /> -->
            <!-- <el-table-column :label="td('ナビゲーションID')" align="center" prop="webId" /> -->
            <el-table-column :label="td('言語コード')" align="center" prop="langCode" />
            <el-table-column :label="td('言語名')" align="center" prop="langName" />
            <el-table-column :label="td('中文')" align="center" prop="langCn" />
            <el-table-column :label="td('言語翻訳')" align="center" prop="langTranslate" />
            <el-table-column :label="td('備考')" align="center" prop="備考" />
            <el-table-column :label="td('操作')" align="center" width="130" class-name="small-padding fixed-width" fixed="right">
              <テンプレート スロット スコープ="スコープ">
                <el-ボタン
                  サイズ="ミニ"
                  タイプ="テキスト"
                  アイコン="el-icon-edit"
                  @click="handleUpdateLang(scope.row)"
                  v-hasPermi="['cms:websiteLang:edit']"
                >{{td("変更")}} </el-button>
                <el-ボタン
                  サイズ="ミニ"
                  タイプ="テキスト"
                  アイコン="el-icon-delete"
                  @click="handleDeleteLang(scope.row)"
                  v-hasPermi="['cms:websiteLang:remove']"
                >{{td("削除")}}</el-button>
              </テンプレート>
            </el-table-column>
          </el-table>
        </テンプレート>
      </el-table-column>
    </el-table>
	//埋め込みテーブル 
    toogleExpand(行) {
      this.getListLang(行ID);
      $table = this.$refs.table とします。
      $table.toggleRowExpansion(行)
    },
     /** クエリナビゲーション翻訳リスト*/
    リスト言語を取得(id) {
       // ナビゲーション ID に基づいて翻訳リストを取得します。this.LangQueryParams.webId = id;
      listWebsiteLang(this.LangQueryParams).then(応答 => {
        // マップ構造を使用して翻訳リストを保存します this.WebsiteLangMap.set(id,response.rows)
        this.websiteLangTableKey = !this.websiteLangTableKey;
        this.resetLang();
      });
    },
<style lang="scss" スコープ>
.app-コンテナ{
  ::v-ディープ{
    .el-table th {
      背景: #ddeeff;
    }
    .el-table__展開セル{
      下境界線: 0px;
      右境界線: 0px;
      パディング: 0px 0px 0px 47px;
    }
  }
  .テーブルインテーブル {
    上境界線: 0px;
  }
}
</スタイル>

これで、vue+elementUI で埋め込みテーブルを実装する方法の例に関するこの記事は終了です。より関連性の高い vue 要素埋め込みテーブル コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • ElementUI のネストされたテーブルに基づいて複数選択を実装するためのサンプル コード
  • 要素はテーブルのネストを実現し、複数のテーブルが1つのヘッダーを共有します。
  • Vue elementUI フォーム検証実装コード (多層ネスト)
  • Vue elementUI フォーム検証関数配列の多層ネスト

<<:  Linux での Apache サービスの展開と構成

>>:  MySQL トランザクションの詳細

推薦する

MySQL共通インデックスとユニークインデックスの詳細な説明

シナリオ1. ID番号のフィールドを備えた市民システムを維持する2. ビジネス コードでは、重複する...

CSS トップに戻る コード例

最近のウェブサイトのほとんどはページが長く、4 画面または 5 画面の長さのものもあれば、2 画面ま...

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

インストール中に遭遇した問題を記録しておきますので、皆様のお役に立てれば幸いです。 1. ダウンロー...

MySQLデータベース操作の基本コマンド

1. データベースを作成します。 データ data _name を作成します。 PHP でデータベー...

HTML文書におけるol要素の数値制限に関する議論

一般的に言えば、HTML ドキュメント内で極端に大きな <ol> リストに遭遇する可能性...

テーブルを使用する場合と CSS を使用する場合 (経験の共有)

TW のメインテキスト ページは、以前は小さなモニターと低解像度のユーザーを考慮して幅が 850 ピ...

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

この記事のシナリオと組み合わせて、Nginx と Java 環境 (SpringBoot プロジェク...

Docker 学習: コンテナ コンテナの具体的な使用方法

コンテナは Docker のもう一つの中心的な概念です。簡単に言えば、コンテナとは、独立して実行され...

入力要素 [type="file"] を使用する場合のスタイルのカスタマイズとブラウザの互換性の問題に関する議論

この2日間、Baixing.comの筆記試験問題を解いているときに、このような問題に遭遇しました。H...

バックエンドから返される 100,000 個のデータをフロントエンドでより適切に表示するにはどうすればよいですか?

目次予備作業バックエンド構築フロントエンドページダイレクトレンダリングsetTimeout ページン...

HTML5で見逃せないAPIやヒントのまとめ

これまでのブログ投稿では、HTML 5 ではあまり使われていないが注目すべき API やヒントに焦点...

Linux でソフトウェア パッケージのバージョンをアップグレードする方法の詳細な説明

Linux環境で、特定のソフトウェア(パッケージ)がインストールされているかどうかを確認したい。 r...

MYSQLの文字セット設定方法(端末の文字セット)の詳しい説明

序文ターミナルを使用してデータベースまたはテーブルを作成するたびに、文字セットが latin1 であ...

CentOS で yum を使用して rabbitmq-server をインストールする方法

RabbitMQをインストールする前にSocatをインストールする必要があります。そうしないと、Ra...

HTML ウェブページ画像タグ

画像タグ <IMG> を挿入します。今日私たちが目にするカラフルなウェブページはすべて、...