6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Vue-Tables2とScrollBoosterを組み合わせてみる

Last updated at Posted at 2019-05-29

概要

Vue.jsを使って、テーブルタグからデータ明細を見せるようなWebアプリケーションをサクッと実装。
ダッシュボード的なアプリなどでデータを見せる際に便利ではないでしょうか。
タイトルにあるライブラリを使う際の注意点やノウハウを展開します。

ライブラリの紹介

ポイント

  • ScrollBoosterに渡すviewportとcontent
  • $refsから取得するのが楽
  • サンプルコードでは、Vue-Tables2が自動付与するtable-responsiveのclass名を使ってみた
  • updateMetrics()の呼び出し
  • Vue-Tables2にデータが入るとテーブルの幅部分のwidthが変わってしまうので、更新する必要がある
  • その際に使用するのがScrollBooster.updateMetrics()
  • Vue-Tables2が提供するイベント関数を使って、幅の更新をする
  • 設定したのは「ソート(sorted)」「ページネーション(pagenation)」「件数変更(limit)」
  • 「フィルタリング(filter)」でも幅変更があり得るが、幅が伸びる事は無いと思ったので設定してない
  • $nextTickの使用
  • 幅を更新する際、実DOMの更新がされてからでないと幅計算が正しくならないと思われるので、Vueの提供する$nextTickを使っている

サンプルコード

html
<div ref="table">
  <v-client-table :columns="vueTables.columns" :data="vueTables.data" :options="vueTables.options"
    @sorted="updateScrollBooster" @pagination="updateScrollBooster"
    @limit="updateScrollBooster">
  </v-client-table>
</div>
script
// 一部、ここに書いてない定数があるのでそのままは使えない。注意
    new Vue({
      el: '#app',
      data: {
        // vue-tables-2用定義
        vueTables: {
          columns: [
            'acceptDate',
            'validStartDate',
            'validEndDate',
            'productName',
          ],
          data: [],
          options: {
            headings: VUE_TABLES_HEADINGS,
            sortable: [
              'acceptDate', 'validStartDate', 'validEndDate', 'productName',
            ],
            orderBy: { column: 'acceptDate' },
            skin: 'table-striped table-bordered table-hover table-sm',
            texts: VUE_TABLES_TEXTS,
            perPage: 50,
            perPageValues: [50, 100, 500, 1000],
            sortIcon: VUE_TABLES_SORTICON
          },
        },
        scrollBoosterNormal: null,
      },
      mounted() {
        // ScrollBoosterを設定
        let viewport = this.$refs.table.querySelector('.table-responsive');
        let content = viewport.querySelector('table');
        this.scrollBooster = setScrollBooster(viewport, content);
      },
      methods: {
        updateScrollBooster() {
          // ScrollBoosterのviewport幅を更新する(検索結果に合わせて)
          this.$nextTick(function () {
            // nextTickでDOMの幅が確定した状態でupdateMetricsを実行する
            this.scrollBooster.updateMetrics();
          });
        },
      },
    })

補足

Vue-Tables2で横スクロールを有効にするために、実際にはCSS定義も行ってある(overflow-x: scroll)

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?