分组 - 有bug,待处理
基础示例
源码
vue
<template>
<div class="base-view">
<div class="control-panel">
<div style="display: flex" v-for="(config, index) in state.groupConfig" :key="index">
<el-select v-model="config.columnId">
<el-option
v-for="item in groupByOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-select v-model="config.sort">
<el-option
v-for="item in sortOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
<div>
<el-button @click="state.groupConfig.push({ columnId: '', sort: 'asc' })"
>添加分组</el-button
>
<el-button @click="state.groupConfig.pop()">删除分组</el-button>
<el-button type="primary" @click="confirm">确认</el-button>
</div>
</div>
<div style="width: 100%; height: 600px; border: 2px solid var(--color-border)">
<Grid
:columns="columns"
:list="list"
:options="{
defaultExpandAll: true,
border: true,
groupConfig: groupConfig,
}"
></Grid>
</div>
</div>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue';
import { Grid, type Column, type ListItem, CellType } from 'vue-virt-grid';
import { ElButton, ElSelect, ElOption } from 'element-plus';
import 'element-plus/dist/index.css';
const columns: Column[] = [
{ field: 'field1', title: 'title1', type: CellType.Text, width: 200 },
{ field: 'field7', title: 'title7', type: CellType.Text, width: 200 },
{ field: 'field10', title: 'title10', type: CellType.Text, width: 200 },
{ field: 'field11', title: 'title11', type: CellType.Text, width: 200 },
{ field: 'field12', title: 'title12', type: CellType.Text, width: 200 },
];
const groupConfig = ref<{ columnId: string; sort: 'desc' | 'asc' }[]>([
{
columnId: 'field1',
sort: 'asc',
},
]);
const state = reactive<{
groupConfig: {
columnId: string;
sort: 'desc' | 'asc';
}[];
}>({
groupConfig: [
{
columnId: 'field1',
sort: 'asc',
},
],
});
const confirm = () => {
groupConfig.value = [...state.groupConfig];
};
const sortOptions = [
{ label: '升序', value: 'asc' },
{ label: '降序', value: 'desc' },
];
const groupByOptions = [
{ value: 'field1', label: 'title1' },
{ value: 'field7', label: 'title7' },
{ value: 'field10', label: 'title10' },
{ value: 'field11', label: 'title11' },
{ value: 'field12', label: 'title12' },
];
const list: ListItem[] = [
{
id: '1',
field0: 'row1-field0',
field1: 'row1-field1',
field2: 'row1-field2',
field3: 'row1-field3',
field4: 'row1-field4',
field5: 'row1-field5',
field6: 'row1-field6',
field7: 'row1-field7',
field8: 'row1-field8',
field9: 'row1-field9',
field10: 'row1-field10',
field11: 'row1-field11',
field12: 'row1-field12',
},
{
id: '2',
field0: 'row2-field',
field1: 'row1-field1',
field2: 'row2-field2',
field3: 'row2-field3',
field4: 'row2-field4',
field5: 'row2-field5',
field6: 'row2-field6',
field7: 'row2-field7',
field8: 'row2-field8',
field9: 'row2-field9',
field10: 'row2-field10',
field11: 'row2-field11',
field12: 'row2-field12',
children: [
{
id: '3 - children',
field0: 'row3-field',
field1: 'row3-field1',
field2: 'row3-field2',
field3: 'row3-field3',
field4: 'row3-field4',
field5: 'row3-field5',
field6: 'row3-field6',
field7: 'row3-field7',
field8: 'row3-field8',
field9: 'row3-field9',
field10: 'row3-field10',
field11: 'row3-field11',
field12: 'row3-field12',
children: [
{
id: '4 - children',
field0: 'row4-field',
field1: 'row4-field1',
field2: 'row4-field2',
field3: 'row4-field3',
field4: 'row4-field4',
field5: 'row4-field5',
field6: 'row4-field6',
field7: 'row4-field7',
field8: 'row4-field8',
field9: 'row4-field9',
field10: 'row4-field10',
field11: 'row4-field11',
field12: 'row4-field12',
},
],
},
],
},
{
id: '18',
field0: 'row18-field',
field1: 'row18-field1',
field2: 'row18-field2',
field3: 'row18-field3',
field4: 'row18-field4',
field5: 'row18-field5',
field6: 'row18-field6',
field7: 'row18-field7',
field8: 'row18-field8',
field9: 'row18-field9',
field10: 'row18-field10',
field11: 'row18-field11',
field12: 'row18-field12',
},
{
id: '19',
field0: 'row19-field',
field1: 'row19-field1',
field2: 'row19-field2',
field3: 'row19-field3',
field4: 'row19-field4',
field5: 'row19-field5',
field6: 'row19-field6',
field7: 'row19-field7',
field8: 'row19-field8',
field9: 'row19-field9',
field10: 'row19-field10',
field11: 'row19-field11',
field12: 'row19-field12',
},
{
id: '4',
field0: 'row4-field',
field1: 'row4-field1',
field2: 'row4-field2',
field3: 'row4-field3',
field4: 'row4-field4',
field5: 'row4-field5',
field6: 'row4-field6',
field7: 'row4-field7',
field8: 'row4-field8',
field9: 'row4-field9',
field10: 'row4-field10',
field11: 'row4-field11',
field12: 'row4-field12',
},
{
id: '5',
field0: 'row5-field',
field1: 'row5-field1',
field2: 'row5-field2',
field3: 'row5-field3',
field4: 'row5-field4',
field5: 'row5-field5',
field6: 'row5-field6',
field7: 'row5-field7',
field8: 'row5-field8',
field9: 'row5-field9',
field10: 'row5-field10',
field11: 'row5-field11',
field12: 'row5-field12',
},
{
id: '6',
field0: 'row6-field',
field1: 'row6-field1',
field2: 'row6-field2',
field3: 'row6-field3',
field4: 'row6-field4',
field5: 'row6-field5',
field6: 'row6-field6',
field7: 'row6-field7',
field8: 'row6-field8',
field9: 'row6-field9',
field10: 'row6-field10',
field11: 'row6-field11',
field12: 'row6-field12',
},
{
id: '7',
field0: 'row7-field',
field1: 'row7-field1',
field2: 'row7-field2',
field3: 'row7-field3',
field4: 'row7-field4',
field5: 'row7-field5',
field6: 'row7-field6',
field7: 'row7-field7',
field8: 'row7-field8',
field9: 'row7-field9',
field10: 'row7-field10',
field11: 'row7-field11',
field12: 'row7-field12',
},
{
id: '8',
field0: 'row8-field',
field1: 'row8-field1',
field2: 'row8-field2',
field3: 'row8-field3',
field4: 'row8-field4',
field5: 'row8-field5',
field6: 'row8-field6',
field7: 'row8-field7',
field8: 'row8-field8',
field9: 'row8-field9',
field10: 'row8-field10',
field11: 'row8-field11',
field12: 'row8-field12',
},
{
id: '9',
field0: 'row9-field',
field1: 'row9-field1',
field2: 'row9-field2',
field3: 'row9-field3',
field4: 'row9-field4',
field5: 'row9-field5',
field6: 'row9-field6',
field7: 'row9-field7',
field8: 'row9-field8',
field9: 'row9-field9',
field10: 'row9-field10',
field11: 'row9-field11',
field12: 'row9-field12',
},
{
id: '10',
field0: 'row10-field',
field1: 'row10-field1',
field2: 'row10-field2',
field3: 'row10-field3',
field4: 'row10-field4',
field5: 'row10-field5',
field6: 'row10-field6',
field7: 'row10-field7',
field8: 'row10-field8',
field9: 'row10-field9',
field10: 'row10-field10',
field11: 'row10-field11',
field12: 'row10-field12',
},
{
id: '11',
field0: 'row11-field',
field1: 'row11-field1',
field2: 'row11-field2',
field3: 'row11-field3',
field4: 'row11-field4',
field5: 'row11-field5',
field6: 'row11-field6',
field7: 'row11-field7',
field8: 'row11-field8',
field9: 'row11-field9',
field10: 'row11-field10',
field11: 'row11-field11',
field12: 'row11-field12',
},
{
id: '12',
field0: 'row12-field',
field1: 'row12-field1',
field2: 'row12-field2',
field3: 'row12-field3',
field4: 'row12-field4',
field5: 'row12-field5',
field6: 'row12-field6',
field7: 'row12-field7',
field8: 'row12-field8',
field9: 'row12-field9',
field10: 'row12-field10',
field11: 'row12-field11',
field12: 'row12-field12',
},
{
id: '13',
field0: 'row13-field',
field1: 'row13-field1',
field2: 'row13-field2',
field3: 'row13-field3',
field4: 'row13-field4',
field5: 'row13-field5',
field6: 'row13-field6',
field7: 'row13-field7',
field8: 'row13-field8',
field9: 'row13-field9',
field10: 'row13-field10',
field11: 'row13-field11',
field12: 'row13-field12',
},
{
id: '14',
field0: 'row14-field',
field1: 'row14-field1',
field2: 'row14-field2',
field3: 'row14-field3',
field4: 'row14-field4',
field5: 'row14-field5',
field6: 'row14-field6',
field7: 'row14-field7',
field8: 'row14-field8',
field9: 'row14-field9',
field10: 'row14-field10',
field11: 'row14-field11',
field12: 'row14-field12',
},
{
id: '15',
field0: 'row15-field',
field1: 'row15-field1',
field2: 'row15-field2',
field3: 'row15-field3',
field4: 'row15-field4',
field5: 'row15-field5',
field6: 'row15-field6',
field7: 'row15-field7',
field8: 'row15-field8',
field9: 'row15-field9',
field10: 'row15-field10',
field11: 'row15-field11',
field12: 'row15-field12',
},
{
id: '16',
field0: 'row16-field',
field1: 'row16-field1',
field2: 'row16-field2',
field3: 'row16-field3',
field4: 'row16-field4',
field5: 'row16-field5',
field6: 'row16-field6',
field7: 'row16-field7',
field8: 'row16-field8',
field9: 'row16-field9',
field10: 'row16-field10',
field11: 'row16-field11',
field12: 'row16-field12',
},
{
id: '17',
field0: 'row17-field',
field1: 'row17-field1',
field2: 'row17-field2',
field3: 'row17-field3',
field4: 'row17-field4',
field5: 'row17-field5',
field6: 'row17-field6',
field7: 'row17-field7',
field8: 'row17-field8',
field9: 'row17-field9',
field10: 'row17-field10',
field11: 'row17-field11',
field12: 'row17-field12',
},
];
</script>
<style lang="scss">
.base-view {
width: 100%;
height: 100%;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 8px;
.control-panel {
display: flex;
flex-direction: column;
gap: 4px;
}
}
</style>