Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vuetify 2.x: v-data-table expand row on click

Tags:

vuetify.js

I am using Vuetify.js and I am creating a a v-data-table

I cannot figure out how to expand a row by clicking anywhere on it, it seems that the only possibility is by using the show-expand property and clicking the icon

Final solution

As suggested here, the v-data-table can link an array to its expanded property, so if you push any item from the table, to this array, it will expand the corresponding row. Intuitive and smart

<template>
  <v-data-table
    :headers="headers"
    :items="items"
    :expanded="expanded"
    item-key="id"
    @click:row="expandRow"
  />
</template>

<script>
  data () {
    return {
      expanded: [],
    }
  },

  expandRow (item) {
    // would be
    // this.expanded = [item]
    // but if you click an expanded row, you want it to collapse
    this.expanded = item === this.expanded[0] ? [] : [item]
  },
</script>
like image 590
isebarn Avatar asked Aug 28 '19 14:08

isebarn


People also ask

How do you make a table row expandable?

The expandable table can be achieved by using JavaScript with HTML. By Clicking on a row of the table, it expands and a sub-table pops up. When the user again clicks on that row the content will hide. This can be very useful when the data is complex but it is inter-related.

What is V data table?

The v-data-table component is used for displaying tabular data. Features include sorting, searching, pagination, inline-editing, and row selection.

What is Vuetify used for?

Vuetify is a complete UI framework built on top of Vue. js. The goal of the project is to provide developers with the tools they need to build rich and engaging user experiences.

What is Vuetify in VUE JS?

Vuetify is a Vue UI Library with beautifully handcrafted Material Components. No design skills required — everything you need to create amazing applications is at your fingertips. Get Started.


2 Answers

It worked for me:

<v-data-table
  ...
  @click:row="(item, slot) => slot.expand(!slot.isExpanded)"
/>

Api docs here

like image 198
Micael Avatar answered Nov 03 '22 05:11

Micael


There is a click event which gives you the current row on the v-data-table. This one you can use. In the event you update the expanded value

Like this:

HTML:

 <div id="app">
  <v-app id="inspire">
    <v-data-table
      :headers="headers"
      :items="desserts"
      :expanded="expanded"
      item-key="name"
      show-expand
      class="elevation-1"
      @click:row="clicked">
      <template v-slot:top>
        <v-toolbar flat color="white">
          <v-toolbar-title>Expandable Table</v-toolbar-title>
          <div class="flex-grow-1"></div>
          <v-switch v-model="singleExpand" label="Single expand" class="mt-2"></v-switch>
        </v-toolbar>
      </template>
      <template v-slot:expanded-item="{ headers }">
        <td :colspan="headers.length">Peek-a-boo!</td>
      </template>
    </v-data-table>
  </v-app>
</div>

vue js:

new Vue({
  el: '#app',
  vuetify: new Vuetify(),
  methods: {
    clicked(value) {
      this.expanded.push(value)
    }
},

  data () {
    return {
      expanded: ['Donut'],
      singleExpand: false,
      headers: [
        {
          text: 'Dessert (100g serving)',
          align: 'left',
          sortable: false,
          value: 'name',
        },
        { text: 'Calories', value: 'calories' },
        { text: 'Fat (g)', value: 'fat' },
        { text: 'Carbs (g)', value: 'carbs' },
        { text: 'Protein (g)', value: 'protein' },
        { text: 'Iron (%)', value: 'iron' },
      ],
      desserts: [
        {
          name: 'Frozen Yogurt',
          calories: 159,
          fat: 6.0,
          carbs: 24,
          protein: 4.0,
          iron: '1%',
        },
        {
          name: 'Ice cream sandwich',
          calories: 237,
          fat: 9.0,
          carbs: 37,
          protein: 4.3,
          iron: '1%',
        },
        {
          name: 'Eclair',
          calories: 262,
          fat: 16.0,
          carbs: 23,
          protein: 6.0,
          iron: '7%',
        }
      ],
    }
  },
})
like image 16
dreijntjens Avatar answered Nov 03 '22 06:11

dreijntjens