株式会社HAMWORKS
🖌

VDataTable 変更点(Vuetify 2 〜 Vuetify 3 アップデート)

2024/04/19に公開

Vuetify 3 になって、VDataTableVuetify 2 から変更点があります。
長くVuetify 3でLabs状態だった機能が去年正式にリリースされました。

しかし、新しい VDataTableは、 Vuetify 2 と、Vuetify 3 で変更点が多く書き換えが多く発生している状態です。
この記事では、Vuetify 2 から Vuetify 3 の VDataTable のアップデート周りの参考になればと思っています。

その点を含めて、Vuetify 2と Vuetify 3 の VDataTable のアップデートの参考としてまとめました。

Vuetify 2 から Vuetify 3 の VDataTable の変更点

Coposition API の利用

Vuetify 3 からは Vue3 になったことで Composition API が利用できるようになりました。
VDataTable は Composition API を利用して、データの取得や、データの操作を行うことができます。

本記事では、Composition API を利用して、VDataTable を利用する方法を紹介します。

headersのプロパティ変更

Vuetify 2のコードをそのままVuetify 3に移行すると、headers のプロパティが変更されているため、ヘッダーのテキストが表示されません。

textをtitleに変更することで表示されます。

const headers = [
  {
    title: '名前',
    align: 'start',
    key: 'name',
    sortable: true
  }
]

テーブルのヘッダーを非表示

hide-default-header で Vuetify 2 では非表示になりました。
Vuetify 3 では、<template #headers /> を渡して非表示にすることができます。

サンプルコードでは、props.isHideHeadertrue の場合は、ヘッダーを非表示にしています。

https://v2.vuetifyjs.com/ja/api/v-data-table/#props-hide-default-header

https://vuetifyjs.com/en/api/v-data-table/#slots-headers

<script setup lang="ts">
const props = defineProps<{
  isHideHeader: boolean
}>()
  
const headers = [
  {
    title: '名前',
    align: 'start',
    key: 'name',
    sortable: true
  },
  {
    title: 'Key',
    align: 'start',
    key: 'key',
    sortable: true
  }
]
const items = [
  {
    name: 'Frozen Yogurt',
    key: 1
  },
  ...
]
</script>
<template>
  <v-data-table
    :headers="headers"
    :items="items"
  >
    <template v-if="props.isHideHeader" #headers />
  </v-data-table>
</template>

テーブルのフッターを非表示

ページネーションなどを非表示するために、Vuetify 2では、hide-defalut-footer が利用されていました。
Vuetify 3 では、<template #bottom /> を渡して非表示にすることができます。

https://v2.vuetifyjs.com/ja/api/v-data-table/#props-hide-default-footer

https://vuetifyjs.com/en/api/v-data-table/#slots-bottom

@click:row から expand-on-click

Vuetify 2 では、@click:row で行をクリックすると、行が展開されて関数を定義することでクリックした部分をexpandしたりすることができました。
Vuetify 3 でも @click:row は引き続き利用可能ですが、 expand-on-click で行の展開をすることができるようになりました。

https://vuetifyjs.com/en/api/v-data-table/#props-expand-on-click

expand-on-click を利用する場合、 itemsにidを設定することで、クリックした行を識別して展開します。
idがない場合は、itemsにデータを渡す前に加工して idを渡すように実装上はしています。

const itemsExpanded = [
  {
    name: 'Frozen Yogurt',
    id: 1,  // idを識別して展開できる
    children: [
      {
        name: 'Frozen Yogurt'
      },
      {
        name: 'Frozen Yogurt'
      }
    ]
  },
  {
    name: 'Ice cream sandwich',
    id: 2,
    children: [
      {
        name: 'Frozen Yogurt2'
      },
      {
        name: 'Frozen Yogurt2'
      }
    ]
  }
]

実際に加工しているコードは以下のようになります。

const items = computed(() => props.items.map(({ key: id, ...others }) => ({ ...others, id })))

show-expandのプロパティを渡すと、開閉アイコンが表示されます。
expand-on-clickを渡すことで、行をクリックすると展開されるようになります。

<template>
  <v-data-table
    expand-on-click
    show-expand
  />
</template>

また、Vuetify3からUIが変わったことで、いままで expandしたコンテンツの表示でドロップシャドウがついてました。
こちらは、既存のアップデートで遜色なく見た目を維持するためにグローバルにCSSをあててます。

.expanded-row {
  box-shadow: 0 0 8px 5px rgba(0, 0, 0, 0.5) inset;
}

まとめ

Vuetify 3 になって、VDataTable は、まだまだ変更点があります。
fetchしたデータを展開する場合は、 v-data-table-server を利用します。
まだまだ変更点ありますが、引き続き知見をこの記事でまとめていきたいと思います。

今回のサンプルコード

https://nuxt3-vuetify-storybook.pages.dev/?path=/docs/components-vdatatable--documentation

株式会社HAMWORKS
株式会社HAMWORKS

Discussion