Некоторое время я пытался создать вложенные таблицы данных, используя таблицы данных VueJs и Vuetify.
Вот что я пытаюсь достичь:
Я хотел бы иметь одну основную таблицу данных с фильтрами, поиском и всем остальным (я думаю, что я правильно понял эту часть, используя вычисленные свойства и повторно использовать мои отфильтрованные данные в таблице данных), и некоторые другие таблицы данных вложенный под основной.
Чтобы добиться этого, я использовал возможность «развернуть» таблиц данных Vuetify и создал дочерние таблицы в этой области расширения.
Несмотря на то, что мне удалось выполнить вложенную часть, по крайней мере, визуально, я не могу решить проблему:
Я хотел бы добавить флажок в родительской строке (то есть строке родительской таблицы данных) и иметь возможность выбрать все, что находится в его слоте расширения.
Он, безусловно, «работает», так как эффективно отбирает данные, связанные со строкой, но не помечает данные в расширенной области как выбранные.
Вот скриншот того, что я хотел бы случиться, когда выберу строку «Десерты».
И вместо этого происходит выделение строки, но не дочерних элементов в области расширения.
В итоге: я хотел бы установить флажок, который действует как флажок «выбрать все», который находится в заголовках дочерней таблицы данных. Принимая во внимание, мне нужно иметь 3 вложенные таблицы данных (здесь только две), где родитель всегда выбирает все дочерние элементы и где дочерние элементы могут быть не выбраны или повторно выбраны по желанию.
Я сделал ручку для вас, ребята, чтобы понять, что я пытаюсь сделать, может быть, вы можете помочь? (https://codepen.io/Synkied/pen/qGLNBv?editors=1010)
А вот код:
<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%'
}
]
}
]
})
})
Большое спасибо, классное сообщество!