我试图找出在表格中渲染子行的最佳方法。
我正在开发基本上是桌子+手风琴的东西。也就是说,当您单击该表以显示该条目的更多详细信息时,该表会添加更多行。
我的表位于Researcher Groups组件中,该组件有一个子组件:" app-researcher-group-entry(ResearcherGroupEntry)。
我正在使用Vue-Material,但如果我使用普通话,问题就会一样。
无论如何,我的结构有点像:
// ResearcherGroups.vue
<template>
<md-table>
<md-table-row>
<md-table-head></md-table-head>
<md-table-head>Researcher</md-table-head>
<md-table-head>Type</md-table-head>
<md-table-head></md-table-head>
<md-table-head></md-table-head>
</md-table-row>
<app-researcher-group-entry v-for="(group, index) in researcherGroups" :key="group.label" :groupData="group" :indexValue="index"></app-researcher-group-entry>
</md-table>
</template>
在ResearcherGroupEntry.vue中:
<template>
<md-table-row>
<md-table-cell>
<md-button class="md-icon-button md-primary" @click="toggleExpansion">
<md-icon v-if="expanded">keyboard_arrow_down</md-icon>
<md-icon v-else>keyboard_arrow_right</md-icon>
</md-button>
<md-button @click="toggleExpansion" class="index-icon md-icon-button md-raised md-primary">{{indexValue + 1}}</md-button>
</md-table-cell>
<md-table-cell>{{groupData.label}}</md-table-cell>
<md-table-cell>Group</md-table-cell>
<md-table-cell>
<md-button @click="openTab" class="md-primary">
<md-icon>add_box</md-icon>
Add Client / Client Type
</md-button>
</md-table-cell>
<md-table-cell>
<md-button class="md-primary">
<md-icon>settings</md-icon>
Settings
</md-button>
</md-table-cell>
<app-add-client-to-group-tab :indexValue="indexValue" :groupData="groupData" :closeTab="closeTab" :addClientToGroupTab="addClientToGroupTab"></app-add-client-to-group-tab>
</md-table-row>
</template>
问题出现在哪里。我希望能够从我们的模型中扩展这样的客户端:
如果我可以在ResearcherGroupEntry组件中添加另一个,那么这将非常简单。不幸的是,使用div或span标签包装在这里不起作用(它弄乱了桌子)。
如果我没有使用Vue Material,我可能会考虑将JSX用于此组件,因为那时我可以简单地在父组件中使用.map来创建基于这两个变量的组件数组。我仍然可以用v-for指令做到这一点,但我不确定。我可能要做的是从道具中创建一个在父母和孩子中合并的疯狂伪阵列,但这是 UUUUUGLY 代码。
答案 0 :(得分:3)
这里的关键是行组件不会呈现自己的子行。您可以使用<template>
标记来提供无实体v-for
和v-if
包装。在模板中执行v-for
,以便输出行tr
以及一些可选的子行tr
。简单的例子:
new Vue({
el: '#app',
data: {
rows: [{
id: 1,
name: 'one',
subrows: ['a', 'b', 'c']
},
{
id: 2,
name: 'two',
subrows: ['d', 'e', 'f']
}
],
expanded: {}
},
methods: {
expand(id) {
this.$set(this.expanded, id, true);
}
},
components: {
aRow: {
template: '<tr><td>{{name}}</td><td><button @click="expand">Expand</button></td></tr>',
props: ['name', 'id'],
methods: {
expand() {
this.$emit('expand', this.id);
}
}
},
subRow: {
template: '<tr><td colspan=2>{{value}}</td></tr>',
props: ['value']
}
}
});
&#13;
<script src="//unpkg.com/vue@latest/dist/vue.js"></script>
<table id="app" border=1>
<tbody>
<template v-for="r in rows">
<a-row :id="r.id" :name="r.name" @expand="expand"></a-row>
<template v-if="r.id in expanded">
<sub-row v-for="s in r.subrows" :value="s"></sub-row>
</template>
</template>
</tbody>
</table>
&#13;