4

我有一个包含可扩展行的 vuetify 数据表。我与演示的唯一真正区别是我希望该item.name列像 V 形图标一样打开/关闭可扩展行。当我@click在该列的 v-slot 上放置一个处理程序时,我得到了错误Error in v-on handler: "TypeError: expand is not a function"。这是我需要自定义的唯一列,因此我不想<tr>手动构建整个 v 槽。下面是一个按比例缩小的代码示例。谢谢。

<v-data-table
    :headers="headers"
    :items="products"
    item-key="productCode"
    show-expand
    :expanded.sync="expanded"
>

  <template v-slot:item.name="{ item, expand, isExpanded }" >
    <h4 class="my-2" @click="expand(!isExpanded)">{{ item.name }} located in {{ item.depot | camelToWords }}</h4>
  </template>

  <template v-slot:expanded-item="{ headers, item }">
    <ProductDetailExpandedRow :currentProduct="item" :headers="headers"/>
  </template>

</v-data-table>

<script>
export default {
  data() {
    return {
      headers: [
        {
          text: 'Name',
          value: 'name',
        },
        {
          text: 'Product ID',
          value: 'productCode',
        },
        {
          text: 'Stock',
          value: 'stock',
        },
6 more columns continue on here...
      ],
      products: [],
    }
  }
}
</script>
4

1 回答 1

6

列点击

这是通过特定列单击来完成的方法。@click在列的槽模板中放置一个处理程序。此处理程序在单击时接收列数据。在这种情况下,列的名称是name

<template v-slot:item.name="slotData">
   <div @click="clickColumn(slotData)">{{ slotData.item.name }}</div>
</template>

expanded在数组中跟踪展开的行,因此添加该行的数据。但如果它已经存在,请将其删除(因为您正在尝试折叠已经展开的列)

clickColumn(slotData) {
  const indexRow = slotData.index;
  const indexExpanded = this.expanded.findIndex(i => i === slotData.item);
  if (indexExpanded > -1) {
    this.expanded.splice(indexExpanded, 1)
  } else {
    this.expanded.push(slotData.item);
  }
}

这是codepen(单击第一列时行展开,在填充内)

行点击

这是您如何通过单击行(即任何列)来完成的。在模板中,<v-data-table>click:row事件添加一个监听器:

<v-data-table @click:row="clickRow">
...
</v-data-table>

此事件传递两个参数:项目和项目槽数据,包括单击行的索引。使用此信息来修改this.expanded跟踪所有展开行的数组:

clickRow(item, event) {
  if(event.isExpanded) {
    const index = this.expanded.findIndex(i => i === item);
    this.expanded.splice(index, 1)
  } else {
    this.expanded.push(item);
  }
}

这会将项目添加到expanded数组中,或者通过查找索引并使用来删除它splice

这是代码笔(单击行中的任意位置时行展开)

于 2021-01-09T05:41:13.790 回答