我一直在努力使用VueJs和Vuetify数据表创建嵌套数据表。
这是我想要达到的目标:
我希望有一个主数据表,带有过滤器、搜索和其他所有功能(我认为我做对了这一部分,使用了计算属性并在数据表中重用了过滤后的数据),以及嵌套在主数据表下的其他一些数据表。
为此,我使用了Vuetify数据表的"扩展"功能,并在此扩展范围下创建了子表。
虽然我已经能够实现嵌套部分,至少从视觉上讲,我似乎不能把我的头围绕一个问题:我想在父行(即父数据表的一行)上添加一个复选框,这样就可以选择扩展槽中的所有内容。它当然可以"工作",因为它可以有效地选择绑定到该行的数据,但不会将扩展范围下的数据标记为选中。
下面是我选择"Desserts"行时希望发生的情况的屏幕截图。
而实际情况是选择了行,但没有选择扩展范围下的子元素。
总之:我希望有一个复选框,就像'选择所有'复选框的标题上的子数据表。同时记住,我需要有3个嵌套的数据表(这里只有两个),其中父总是选择所有的子元素,其中儿童可以取消选择或重新选择的意愿。
想知道我在做什么,也许你能帮上忙?
代码如下:
<div id="app">
<v-app id="inspire">
<v-data-table
v-model="selected"
:headers="headers"
:items="treats"
:pagination.sync="pagination"
expand="true"
select-all
item-key="category"
class="elevation-1"
hide-actions
>
<template v-slot:items="props">
<tr @click="props.expanded = !props.expanded">
<td>
<!-- This one should select every items under the expand slot -->
<v-checkbox
@click.stop="props.selected = !props.selected"
:input-value="props.selected"
primary
hide-details
></v-checkbox>
</td>
<td class="text-xs-right">{{ props.item.category }}</td>
</tr>
</template>
<template v-slot:expand="props">
<v-data-table
v-model="selected"
:headers="headers"
:items="props.item.food"
:pagination.sync="pagination"
expand="true"
select-all
item-key="category"
class="elevation-1"
hide-actions
>
<!-- I should be able to hide headers and have the parent row checkbox act like the select all headers' checkbox -->
<template v-slot:items="props">
<tr @click="props.expanded = !props.expanded">
<td>
<v-checkbox
:input-value="props.selected"
primary
hide-details
></v-checkbox>
</td>
<td>{{ props.item.name }}</td>
<td class="text-xs-right">{{ props.item.calories }}</td>
<td class="text-xs-right">{{ props.item.fat }}</td>
<td class="text-xs-right">{{ props.item.carbs }}</td>
<td class="text-xs-right">{{ props.item.protein }}</td>
<td class="text-xs-right">{{ props.item.iron }}</td>
</tr>
</template>
</v-data-table>
</template>
</v-data-table>
{{ selected }}
</v-app>
</div>
new Vue({
el: '#app',
data: () => ({
pagination: {
sortBy: 'name'
},
selected: [],
headers: [
{
text: 'Dessert (100g serving)',
align: 'left',
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' }
],
treats: [
{
category: 'Desserts',
food: [
{
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: 'Cupcake',
calories: 305,
fat: 3.7,
carbs: 67,
protein: 4.3,
iron: '8%'
}
]
},
{
category: 'Entries',
food: [
{
name: 'Melon',
calories: 159,
fat: 6.0,
carbs: 24,
protein: 4.0,
iron: '1%'
},
{
name: 'Hummus',
calories: 237,
fat: 9.0,
carbs: 37,
protein: 4.3,
iron: '1%'
}
]
}
]
})
})
2条答案
按热度按时间3htmauhk1#
raogr8fs2#
如果有人还想做这样的事情,请检查我做的这个codesandbox,这是我能够用当前的vuetify版本(2.6.0):https://codesandbox.io/s/stack-56402577-4o6gv?file=/src/components/NestedTables.vue
待办事项:
预览: