Y
In order to avoid duplication of markings for several layers, a directive could be applied in the template. v-for♪A little difficulty in the component v-data-table Use the dynamic names of the table ' s, in format header.<name> and item.<name> - Where? vername is the identity of the data facility (element) items)The problem of content falling into the default slope arose in the question code only because of the transmission as a name of the elephant of the data facility, instead of the expected "put" component.
We need to use the template. computed Name of each elephant participating in the bulkhead:<template v-for="prop in itemProps"
v-slot:[`item.${prop}`]="{ item }"
>
<div class="d-flex flex-column" :key="prop">
<b>{{ item[prop] }}</b>
<span>{{ item[prop] }}</span>
</div>
</template>
Massives with recalibration properties (named) itemProps In the example above, a literary may be placed or may be derived from the structure of the headings of the table (propose that the component is represented by a mass headerscomputed: {
itemProps() {
return this.headers.map(header => header.value);
},
// ...
},
Demo https://vuetifyjs.com/en/components/data-tables/#item - here to demonstrate the slope cycle through v-for♪ of All Poles (not just the second, as in the original):new Vue({
el: '#app',
vuetify: new Vuetify(),
data () {
return {
headers: [
{
text: 'Dessert (100g serving)',
align: 'start',
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%' },
{ name: 'Cupcake', calories: 305, fat: 3.7, carbs: 67, protein: 4.3, iron: '8%' },
{ name: 'Gingerbread', calories: 356, fat: 16.0, carbs: 49, protein: 3.9, iron: '16%' },
{ name: 'Jelly bean', calories: 375, fat: 0.0, carbs: 94, protein: 0.0, iron: '0%' },
{ name: 'Lollipop', calories: 392, fat: 0.2, carbs: 98, protein: 0, iron: '2%' },
{ name: 'Honeycomb', calories: 408, fat: 3.2, carbs: 87, protein: 6.5, iron: '45%' },
{ name: 'Donut', calories: 452, fat: 25.0, carbs: 51, protein: 4.9, iron: '22%' },
{ name: 'KitKat', calories: 518, fat: 26.0, carbs: 65, protein: 7, iron: '6%' },
],
}
},
computed: {
itemProps() {
return this.headers.map(header => header.value);
},
},
methods: {
getColor (calories) {
if (calories > 400) return 'red'
else if (calories > 200) return 'orange'
else return 'green'
},
},
})<div id="app">
<v-app id="inspire">
<v-data-table :headers="headers" :items="desserts" class="elevation-1">
<template v-for="prop in itemProps"
v-slot:[`item.${prop}`]="{ item }"
>
<v-chip dark :key="prop" :color="getColor(item.calories)">
{{ item[prop] }}
</v-chip>
</template>
</v-data-table>
</v-app>
</div>
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@4.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>