Vuetify 数据 Table 单击列展开行
Vuetify Data Table Expand Row on Column Click
我有一个包含可扩展行的 vuetify 数据 table。我与 the demo 唯一真正的区别是我希望 item.name
列到 open/close 可扩展行,就像人字形图标一样。当我在该列的 v 槽上放置一个 @click
处理程序时,我收到错误 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>
列点击
以下是点击特定列的方法。在列的槽模板中放置一个 @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(单击第一列时行展开,在填充内)
行点击
这里是您可以通过 行 单击(即任何列)来实现的方法。在模板中,为 click:row
事件添加 <v-data-table>
的侦听器:
<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
.
将其删除
这是 codepen(单击行中的任意位置时行展开)
我有一个包含可扩展行的 vuetify 数据 table。我与 the demo 唯一真正的区别是我希望 item.name
列到 open/close 可扩展行,就像人字形图标一样。当我在该列的 v 槽上放置一个 @click
处理程序时,我收到错误 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>
列点击
以下是点击特定列的方法。在列的槽模板中放置一个 @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(单击第一列时行展开,在填充内)
行点击
这里是您可以通过 行 单击(即任何列)来实现的方法。在模板中,为 click:row
事件添加 <v-data-table>
的侦听器:
<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
.
这是 codepen(单击行中的任意位置时行展开)