3 changed files with 64 additions and 67 deletions
@ -1,65 +1,41 @@ |
|||||
<template> |
<template> |
||||
<tbody> |
<tbody> |
||||
<tr> |
<tr> |
||||
<td v-if="level === 1" :rowspan="calculateRowspan(item)">{{ item.categoryName }}</td> |
<td v-if="level === 1">{{ item.categoryName }}</td> |
||||
<td v-else></td> |
<td v-else></td> |
||||
<td v-if="level === 2" :rowspan="calculateRowspan(item)">{{ item.categoryName }}</td> |
<td v-if="level === 2">{{ item.categoryName }}</td> |
||||
<td v-else></td> |
<td v-else></td> |
||||
<td v-if="level === 3" :rowspan="calculateRowspan(item)">{{ item.categoryName }}</td> |
<td v-if="level === 3">{{ item.categoryName }}</td> |
||||
<td v-else></td> |
<td v-else></td> |
||||
<td v-if="level === 4">{{ item.categoryName }}</td> |
<td v-if="level === 4">{{ item.categoryName }}</td> |
||||
<td v-if="level === 4">{{ item.eventCount }}</td> |
<td v-else></td> |
||||
<td v-if="level === 4">{{ item.proportion }}</td> |
<td>{{ item.eventCount }}</td> |
||||
</tr> |
<td>{{ item.proportion }}</td> |
||||
<component |
</tr> |
||||
v-for="child in item.children" |
<TableRow |
||||
:is="'TableRow'" |
v-for="child in item.children" |
||||
:key="child.id" |
:key="child.id" |
||||
:item="child" |
:item="child" |
||||
:level="level + 1" |
:level="level + 1" |
||||
/> |
/> |
||||
</tbody> |
</tbody> |
||||
</template> |
</template> |
||||
|
|
||||
<script> |
<script> |
||||
export default { |
export default { |
||||
name: 'TableRow', |
name: 'TableRow', |
||||
props: { |
props: { |
||||
item: { |
item: { |
||||
type: Object, |
type: Object, |
||||
required: true, |
required: true, |
||||
|
}, |
||||
|
level: { |
||||
|
type: Number, |
||||
|
required: true, |
||||
|
}, |
||||
}, |
}, |
||||
level: { |
components: { |
||||
type: Number, |
TableRow: () => import('./TableRow.vue'), // 动态导入自身以处理递归 |
||||
required: true, |
|
||||
}, |
}, |
||||
}, |
}; |
||||
methods: { |
</script> |
||||
calculateRowspan(item) { |
|
||||
if (!item.children || !item.children.length) { |
|
||||
return 1; |
|
||||
} |
|
||||
return item.children.reduce((sum, child) => sum + this.calculateRowspan(child), 0); |
|
||||
}, |
|
||||
}, |
|
||||
}; |
|
||||
</script> |
|
||||
|
|
||||
<style scoped> |
|
||||
table { |
|
||||
width: 100%; |
|
||||
border-collapse: collapse; |
|
||||
} |
|
||||
|
|
||||
th, td { |
|
||||
width: 40px; |
|
||||
height: 20px; |
|
||||
border: 1px solid #ccc; |
|
||||
padding: 8px; |
|
||||
text-align: center; |
|
||||
} |
|
||||
|
|
||||
thead { |
|
||||
background-color: #f9f9f9; |
|
||||
} |
|
||||
</style> |
|
||||
Loading…
Reference in new issue