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

推薦する

Windows10システムにスーパーセットをインストールする手順

Superset は、エレガントなインターフェースとデータ テーブルに基づく動的なデータ生成を主な機...

JavaScriptのURLオブジェクトとは何かについて話しましょう

目次概要ハッシュプロパティホストプロパティホスト名属性Href属性起源のプロパティユーザー名とパスワ...

将来人気が出るであろういくつかのナビゲーション方向

<br />今は情報爆発の時代であるだけでなく、サービス爆発の時代でもあります。それはす...

React Hooksの使用例

目次簡単なコンポーネントの例より複雑な親子コンポーネントのケースオンセレクトの書き方反応する子供Re...

MySQLの日付と時刻の間隔計算の分析例

この記事では、例を使用して、MySQL の日付と時刻の間隔計算について説明します。ご参考までに、詳細...

Linux gzipコマンドの使用

1. コマンドの紹介gzip (GNU zip) コマンドは、ファイルの圧縮と解凍に使用されます。こ...

pdf.js を使用して Vue で PDF ファイルをプレビューする方法

ページ上で PDF をプレビューすると、一部のファイルは印刷またはダウンロードできません。現時点では...

Linux で MySQL パスワードを忘れた場合の解決策

問題は次のとおりです。mysql -uroot -p コマンドを入力しましたが、パスワードを忘れてし...

jQueryはシンプルなカルーセル効果を実装します

みなさんこんにちは。今日はカルーセルの実装についてお話しします。私が作成したカルーセルの効果は次のと...

いくつかの面接の質問を使ってJavaScriptの実行メカニズムを調べる

目次前の単語同期と非同期前菜プレートを追加マクロタスク マイクロタスク約束しましょうタイマーを追加す...

MySQL の frm ファイルからテーブル構造を復元する 3 つの方法 [推奨]

mysql が正常に実行されている場合、テーブル構造を表示することは難しくありません。しかし、場合...

rem をモバイル デバイスに適応させる方法の例

序文モバイル端末のREM適応ソリューションのレビューと概要remの使い方rem 単位の計算は、HTM...

HTML チュートリアル、HTML デフォルト スタイル

html 、アドレス、引用、本文、 dd 、 div 、 dl 、 dt 、フィールドセット、フォ...

JavaScript を使用して QR コードを解析する 3 つの方法

目次1. JavaScriptを使用してQRコードを解析する1. QR コードとは何ですか? 2.q...

Docker で Python スクリプトを実行する方法

まず、Docker イメージ用の特定のプロジェクト ディレクトリを作成します。例: mkdir /h...