我有一个动态更改列的表。 因此,表格的模板不能像这样硬编码 -
<template>
<v-data-table
:headers="headers"
:items="items"
hide-actions
class="elevation-1"
>
<template slot="items" slot-scope="props">
**<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>**
</template>
</v-data-table>
</template>
我在响应中获取此部分的代码。 无法弄清楚如何向前传达。
答案 0 :(得分:12)
我在看同一个问题,找到了一种避免对标记中的数据结构进行硬编码的典型方法;您可以使用标头的内容通过v-for循环使用脚本来编写项目模板,如下所示:
<div id="app">
<v-app id="inspire">
<v-data-table
:headers="headers"
:items="desserts"
hide-actions
class="elevation-1"
>
<template slot="items" slot-scope="myprops">
<td v-for="header in headers">
{{ myprops.item[header.value] }}
</td>
</template>
</v-data-table>
</v-app>
</div>
答案 1 :(得分:3)
这是你可以尝试的东西,我知道它可以工作,因为我使用了类似的方法。但要了解其工作原理,请阅读vue js中的dynamic components。
警告:您必须自己配置每个数据绑定项目,这可能会让人不知所措,但如果您有许多数据表,那么它可能是值得的。 不要放弃 :)
可以使用标头范围广告位配置标头。阅读文档以获取更多详细信息here。查找范围的插槽选项卡,查看您可以配置的内容。
现在,对于列,您必须使用动态组件进行配置。也就是说,根据数据表列的类型返回组件,比如文本是否返回<td>text</td>
,依此类推。我只是为你设计一个想法,你必须配置你想要的方式。
<v-data-table
v-model="tableRowsSelected"
:items="tableItems"
:headers="tableHeaders"
:pagination.sync="tablePagination"
:rows-per-page-items="tablePaginationDropdown"
item-key="name"
class="elevation-1"
>
<template v-if="tableHeaders" slot="headers" slot-scope="row">
<tr>
<th
v-for="header in row.headers"
:key="header.text"
:class="['column sortable', tablePagination.descending ? 'desc' : 'asc', header.value === tablePagination.sortBy ? 'active' : '']"
@click="changeSort(header.value)"
>
<v-icon small>arrow_upward</v-icon>
{{ header.text }}
</th>
</tr>
</template>
<template template slot="items" slot-scope="row">
<tr>
<component v-for="header in Object.keys(row.item)" :key="header" :is="getComponentByColumnType(header, row.item)"></component>
</tr>
</template>
export default {
data () {
return {
tableItems: []
}
computed: {
tableHeaders: function () { }
tablePagination: functin() {}
// and other properties here or you could simply configure them as part of
data.
},
method:{
getComponentByColumnType(header, data) {
// return the component per your column type here.
}
}
}
答案 2 :(得分:1)
我无法得到你的问题,但我假设你想创建一个vuetify表。
以下是模板:
<template>
<v-data-table
:headers="headers"
:items="items"
hide-actions
class="elevation-1"
>
<template slot="items" slot-scope="props">
<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>
</template>
</v-data-table>
</template>
以及脚本下方:
<script>
export default {
data () {
return {
headers: [
{
text: 'Dessert (100g serving)',
align: 'left',
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' }
],
items: [
{
value: false,
name: 'Frozen Yogurt',
calories: 159,
fat: 6.0,
carbs: 24,
protein: 4.0,
iron: '1%'
},
{
value: false,
name: 'Ice cream sandwich',
calories: 237,
fat: 9.0,
carbs: 37,
protein: 4.3,
iron: '1%'
},
{
value: false,
name: 'Eclair',
calories: 262,
fat: 16.0,
carbs: 23,
protein: 6.0,
iron: '7%'
},
{
value: false,
name: 'Cupcake',
calories: 305,
fat: 3.7,
carbs: 67,
protein: 4.3,
iron: '8%'
},
{
value: false,
name: 'Gingerbread',
calories: 356,
fat: 16.0,
carbs: 49,
protein: 3.9,
iron: '16%'
},
{
value: false,
name: 'Jelly bean',
calories: 375,
fat: 0.0,
carbs: 94,
protein: 0.0,
iron: '0%'
},
{
value: false,
name: 'Lollipop',
calories: 392,
fat: 0.2,
carbs: 98,
protein: 0,
iron: '2%'
},
{
value: false,
name: 'Honeycomb',
calories: 408,
fat: 3.2,
carbs: 87,
protein: 6.5,
iron: '45%'
},
{
value: false,
name: 'Donut',
calories: 452,
fat: 25.0,
carbs: 51,
protein: 4.9,
iron: '22%'
},
{
value: false,
name: 'KitKat',
calories: 518,
fat: 26.0,
carbs: 65,
protein: 7,
iron: '6%'
}
]
}
}
}
</script>
这是来自vuetify docs
的复制粘贴现在,如果您想使用动态标头,只需更改标头属性。
我的建议是,在桌子上使用vuetify multiple select。 使用表格列填充多个选择并让用户选择或取消选择。然后在数据表中:标题使用与多个选择对应的属性
例如,如果mutpiple select绑定到e6(属性名称),那么v-data-table将显示:
<v-data-table
:headers="e6" /*this changed*/
:items="items"
hide-actions
class="elevation-1"
>
答案 3 :(得分:1)
对于将来的搜索者,我设法在Codepen中创建了一个示例,以使用vuetify 2调整表列的大小。
https://codepen.io/marcelobbff/pen/BajQwyq?editors=1010
代码:
HTML
<div id="app">
<v-app id="inspire">
<v-container>
<v-row><v-btn @click="add">ADD</v-btn><v-btn @click="remove">REMOVE</v-btn></v-row>
<v-data-table
:headers="headers"
:items="desserts"
>
<template v-slot:body="props">
<tbody>
<tr v-for="item in props.items">
<td v-for="(header, index) in headers">
<span v-if="index">{{ item.cols[index-1] }}</span>
<span v-else>{{ item.name }}</span>
</td>
</tr>
</tbody>
</template>
</v-data-table>
</v-container>
</v-app>
</div>
JS
new Vue({
el: '#app',
vuetify: new Vuetify(),
data () {
return {
index: 0,
headers: [
{
text: 'Name',
align: 'start',
sortable: true,
value: 'name',
},
{ text: '1', value: 'calories', align: 'start' },
{ text: '2', value: 'fat', align: 'start' },
{ text: '3', value: 'carbs', align: 'start' },
{ text: '4', value: 'protein', align: 'start' },
],
desserts: [
{
name: 'Frozen Yogurt',
cols:[0,0,0,0]
},
{
name: 'Ice cream sandwich',
cols:[0,0,0,0]
},
{
name: 'Eclair',
cols:[0,0,0,0]
},
{
name: 'Cupcake',
cols:[0,0,0,0]
},
{
name: 'Gingerbread',
cols:[0,0,0,0]
},
{
name: 'Jelly bean',
cols:[0,0,0,0]
},
{
name: 'Donut',
cols:[0,0,0,0]
},
{
name: 'KitKat',
cols:[0,0,0,0]
},
],
}
},
mounted(){
this.index = this.headers.length
},
methods:{
add(){
this.desserts.forEach(item => { item.cols.push(0) })
this.headers.push({text:this.index, value:this.index})
this.index++
},
remove(){
let header = this.headers.pop()
this.desserts.forEach(item => { item.cols.pop() })
this.index--
},
}
})
答案 4 :(得分:0)
我知道这个问题很旧,但是我遇到了同样的问题,因此偶然发现了该页面。幸运的是,我已经通过编辑Bart给出的代码来满足Vue 2中的最新语法,从而解决了我的问题。
<v-data-table :headers="headers"
:items="myDataObject"
class="elevation-24">
<template v-slot:body="props">
<tr v-for="index in props.items">
<td v-for="header in headers" class="text-left font-weight-black">
{{ index[header.value]}}
</td>
</tr>
</template>
</v-data-table>