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 トランザクションの詳細

推薦する

Vue ファースト スクリーン パフォーマンス最適化コンポーネントの知識ポイントの概要

Vue ファースト スクリーン パフォーマンス最適化コンポーネントVue ファースト スクリーン パ...

Apache Webサーバーのインストールと設定方法

信頼性が高く、人気があり、簡単に構成できる Web サーバーである Apache で独自の Web ...

DockerにNginxをインストールする方法

DockerにNginxをインストールするNginx は、IMAP/POP3/SMTP サービスも提...

Linux 仮想ホストで SourceGuardian (sg11) 暗号化コンポーネントを有効にする詳細な手順

注: sg11 弊社では Linux システム仮想ホストのセルフインストールのみサポートしております...

jQuery Ajax チャットボットの実装事例

チャットボットは多くの手作業を省くことができ、顧客サービス、天気予報対応など、さまざまな状況で使用で...

2 級コンピュータ試験のための MySQL の知識ポイントとよく使用される MYSQL コマンド

2級コンピュータ試験のMySQL知識ポイントの基礎、一般的なMYSQLコマンドは次のとおりです。よく...

Vue で手ぶれ補正を実装するためのサンプルコード

手ぶれ防止: 繰り返しのクリックによるイベントのトリガーを防止まず、揺れとは何でしょうか? 震えるの...

組み込み Linux 開発環境で ping と nfs を構築するためのソリューション

1. 組み込みソフトウェアレベル 1) ブートローダ -> ブートローダ組み込みシステム全体の...

MySQLデータベースの基礎知識

目次1. データベースを理解する1.1 データベースとデータ構造の関係1.2 なぜデータベースが必要...

HTMLリンクを書くときは、HTTPリクエストを減らすためにサブフォルダに必ずスラッシュを追加してください。

サブフォルダーの末尾にスラッシュがない場合、2 つの HTTP リクエストが生成され、効率に影響しま...

写真とテキストによる MySQL と sqlyog のインストール チュートリアル

1. MySQL 1.1 MySQLのインストールmysql-5.5.27-winx64 ダウンロー...

ReactのuseEffectクロージャの落とし穴についての簡単な説明

問題コードuseEffectによって発生したクロージャの問題コードを見てみましょう 定数 btn =...

一般的な Linux ディストリビューションのミラーソース構成の概要

最近 Linux を研究していて、いくつかの Linux ディストリビューションを試してみましたが、...

Nodejs のグローバル変数とグローバルオブジェクトの知識ポイントと使用方法の詳細

1. グローバルオブジェクトすべてのモジュールは呼び出すことができます1) global: ブラウザ...

面接では、select...for update がテーブルをロックするのか、それとも行をロックするのか尋ねられました。

目次確認する:例の検証と組み合わせるselect クエリ ステートメントはロックされませんが、sel...