📌

v-resizeを使ってv-data-tableの高さを自動調整

2023/09/07に公開

全体のレイアウトはこのように、HeaderとTable二つ部分があります。Headerの部分には、表示条件によって、高さは変わります。さらに、Responsiveにもするので、縦と横表示したら、高さも変わります。

実現したいこと:Headerの高さが変わっても、Table部分は残りのスペースを全部埋めてくれたらよいです。

高さ自動調整のレイアウトを作成

<template>
  <div v-resize="onResize">
    <slot name="header" />
    <div ref="tableContainer">
      <slot name="table" :table-height="tableHeight" />
    </div>
  </div>
</template>

<script>
export default {
  name: "MyLayout",
  data() {
    ...
    tableHeight: 0,
  },
  methods: {
    onResize() {	
      // 59はv-data-tableのfooterのデフォルト高さ
      this.tableHeight = window.innerHeight - this.$refs.tableContainer.getBoundingClientRect().y - 59;
    },
  },
};
</script>

ポイントは二つ:
1.テーブルの高さをdataにして、propsとして、親から子に渡す。
2.親のほうで、v-resizeを利用して、テーブルの高さを再計算します。

レイアウトにv-data-tableを入れる

<template>
  <v-app>
    <v-main>
      <my-layout>
        <template v-slot:header>
          <h1 class="text-center">Header</h1>
        </template>
        <template v-slot:table="tableProps">
          <v-data-table
            :height="tableProps.tableHeight"
            ...
          >
          </v-data-table>
        </template>
      </my-layout>
    </v-main>
  </v-app>

あとは、v-appはデフォルトでoverflow-yがonにしているぽいので、スクロールバーばずっと表示される。必要がなければ、手動でoffにする必要があります。

以上です。

Discussion