Vuetify 2.x:单击v-data-table展开行

时间:2019-08-28 14:08:21

标签: vuetify.js

我正在使用Vuetify.js,并且正在创建一个v-data-table

我无法弄清楚如何通过单击行中的任意位置来扩展行,似乎唯一的可能性是使用show-expand属性并单击图标

最终解决方案

根据建议的herev-data-table可以将数组链接到其expanded属性,因此,如果将表中的任何项目压入此数组,它将扩展对应的行。直观而聪明

<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>

4 个答案:

答案 0 :(得分:4)

有一个click事件,可为您提供v-data-table上的当前行。您可以使用这个。如果您更新了扩展值

赞:

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%',
        }
      ],
    }
  },
})

答案 1 :(得分:2)

对我有用:

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

Api docs here

答案 2 :(得分:1)

我不确定您是否仍然需要此:P,但我想为看到此信息的人改善dreijntjens答复

因此添加一个侦听器属性

<v-data-table
  :headers="headers"
  :items="desserts"
  :expanded="expanded"
  item-key="name"
  show-expand
  class="elevation-1"
  @click:row="clicked">

并添加此方法

  clicked (value) {
    const index = this.expanded.indexOf(value)
    if (index === -1) {
      this.expanded.push(value)
    } else {
      this.expanded.splice(index, 1)
    }
  },

我的方法实际上会在单击时扩展并关闭

答案 3 :(得分:0)

如果你使用的是 v-slot:item,或者你设置了 prop :hide-default-header="true",那么你可以这样实现:

<template v-slot:item="{item, index}"> 
     <tr @click="expandedIndex = expandedIndex==-1?index:-1">
       <span> {{item}} </span>  
     </tr>
   <tr :colspan="headers.length" v-if="expandedIndex==index">Expanded content</tr>
</template>

如果你希望能够同时展开多行,你可以这样做:

  <v-data-table :headers="headers" :items="items">
    <template v-slot:item="{item, index}"> 
     <tr @click="expandRow(index)">
       <span> {{item}} </span>  
     </tr>
     <tr v-if="expandedRows.includes(index)">
       <td :colspan="headers.length">
            Expanded content 
       </td>
     </tr>
    </template>
 </v-data-table>

<script> 

   ...
   ...

   expandedRows=[]; 
   expandRow(index){ 
     const indexOfRow = this.expandedRows.indexOf(index)
     if(indexOfRow>-1){
       this.expandedRows.splice(indexOfRow,1);
       return;
     }
     this.expandedRows.push(index);
   }
</script>