分组 - 有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"
defaultExpandAll
:groupConfig="groupConfig"
border
show-tree-line
></Grid>
</div>
</div>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue';
import { Grid, type Column, type ListItem, ColumnType } from 'kita-grid';
import { ElButton, ElSelect, ElOption } from 'element-plus';
import 'element-plus/dist/index.css';
const columns: Column[] = [
// FIXME: 这里需要想一下是默认第一列就是title还是?
{ field: 'key1', title: 'title1', type: ColumnType.Title, width: 200 },
{ field: 'key7', title: 'title7', type: ColumnType.Text, width: 200 },
{ field: 'key10', title: 'title10', type: ColumnType.Text, width: 200 },
{ field: 'key11', title: 'title11', type: ColumnType.Text, width: 200 },
{ field: 'key12', title: 'title12', type: ColumnType.Text, width: 200 },
];
const groupConfig = ref<{ columnId: string; sort: 'desc' | 'asc' }[]>([
{
columnId: 'key1',
sort: 'asc',
},
]);
const state = reactive<{
groupConfig: {
columnId: string;
sort: 'desc' | 'asc';
}[];
}>({
groupConfig: [
{
columnId: 'key1',
sort: 'asc',
},
],
});
const confirm = () => {
groupConfig.value = [...state.groupConfig];
};
const sortOptions = [
{ label: '升序', value: 'asc' },
{ label: '降序', value: 'desc' },
];
const groupByOptions = [
{ value: 'key1', label: 'title1' },
{ value: 'key7', label: 'title7' },
{ value: 'key10', label: 'title10' },
{ value: 'key11', label: 'title11' },
{ value: 'key12', label: 'title12' },
];
const list: ListItem[] = [
{
id: '1',
key0: 'row1-key0',
key1: 'row1-key1',
key2: 'row1-key2',
key3: 'row1-key3',
key4: 'row1-key4',
key5: 'row1-key5',
key6: 'row1-key6',
key7: 'row1-key7',
key8: 'row1-key8',
key9: 'row1-key9',
key10: 'row1-key10',
key11: 'row1-key11',
key12: 'row1-key12',
},
{
id: '2',
key0: 'row2-key',
key1: 'row1-key1',
key2: 'row2-key2',
key3: 'row2-key3',
key4: 'row2-key4',
key5: 'row2-key5',
key6: 'row2-key6',
key7: 'row2-key7',
key8: 'row2-key8',
key9: 'row2-key9',
key10: 'row2-key10',
key11: 'row2-key11',
key12: 'row2-key12',
children: [
{
id: '3 - children',
key0: 'row3-key',
key1: 'row3-key1',
key2: 'row3-key2',
key3: 'row3-key3',
key4: 'row3-key4',
key5: 'row3-key5',
key6: 'row3-key6',
key7: 'row3-key7',
key8: 'row3-key8',
key9: 'row3-key9',
key10: 'row3-key10',
key11: 'row3-key11',
key12: 'row3-key12',
children: [
{
id: '4 - children',
key0: 'row4-key',
key1: 'row4-key1',
key2: 'row4-key2',
key3: 'row4-key3',
key4: 'row4-key4',
key5: 'row4-key5',
key6: 'row4-key6',
key7: 'row4-key7',
key8: 'row4-key8',
key9: 'row4-key9',
key10: 'row4-key10',
key11: 'row4-key11',
key12: 'row4-key12',
},
],
},
],
},
{
id: '18',
key0: 'row18-key',
key1: 'row18-key1',
key2: 'row18-key2',
key3: 'row18-key3',
key4: 'row18-key4',
key5: 'row18-key5',
key6: 'row18-key6',
key7: 'row18-key7',
key8: 'row18-key8',
key9: 'row18-key9',
key10: 'row18-key10',
key11: 'row18-key11',
key12: 'row18-key12',
},
{
id: '19',
key0: 'row19-key',
key1: 'row19-key1',
key2: 'row19-key2',
key3: 'row19-key3',
key4: 'row19-key4',
key5: 'row19-key5',
key6: 'row19-key6',
key7: 'row19-key7',
key8: 'row19-key8',
key9: 'row19-key9',
key10: 'row19-key10',
key11: 'row19-key11',
key12: 'row19-key12',
},
{
id: '4',
key0: 'row4-key',
key1: 'row4-key1',
key2: 'row4-key2',
key3: 'row4-key3',
key4: 'row4-key4',
key5: 'row4-key5',
key6: 'row4-key6',
key7: 'row4-key7',
key8: 'row4-key8',
key9: 'row4-key9',
key10: 'row4-key10',
key11: 'row4-key11',
key12: 'row4-key12',
},
{
id: '5',
key0: 'row5-key',
key1: 'row5-key1',
key2: 'row5-key2',
key3: 'row5-key3',
key4: 'row5-key4',
key5: 'row5-key5',
key6: 'row5-key6',
key7: 'row5-key7',
key8: 'row5-key8',
key9: 'row5-key9',
key10: 'row5-key10',
key11: 'row5-key11',
key12: 'row5-key12',
},
{
id: '6',
key0: 'row6-key',
key1: 'row6-key1',
key2: 'row6-key2',
key3: 'row6-key3',
key4: 'row6-key4',
key5: 'row6-key5',
key6: 'row6-key6',
key7: 'row6-key7',
key8: 'row6-key8',
key9: 'row6-key9',
key10: 'row6-key10',
key11: 'row6-key11',
key12: 'row6-key12',
},
{
id: '7',
key0: 'row7-key',
key1: 'row7-key1',
key2: 'row7-key2',
key3: 'row7-key3',
key4: 'row7-key4',
key5: 'row7-key5',
key6: 'row7-key6',
key7: 'row7-key7',
key8: 'row7-key8',
key9: 'row7-key9',
key10: 'row7-key10',
key11: 'row7-key11',
key12: 'row7-key12',
},
{
id: '8',
key0: 'row8-key',
key1: 'row8-key1',
key2: 'row8-key2',
key3: 'row8-key3',
key4: 'row8-key4',
key5: 'row8-key5',
key6: 'row8-key6',
key7: 'row8-key7',
key8: 'row8-key8',
key9: 'row8-key9',
key10: 'row8-key10',
key11: 'row8-key11',
key12: 'row8-key12',
},
{
id: '9',
key0: 'row9-key',
key1: 'row9-key1',
key2: 'row9-key2',
key3: 'row9-key3',
key4: 'row9-key4',
key5: 'row9-key5',
key6: 'row9-key6',
key7: 'row9-key7',
key8: 'row9-key8',
key9: 'row9-key9',
key10: 'row9-key10',
key11: 'row9-key11',
key12: 'row9-key12',
},
{
id: '10',
key0: 'row10-key',
key1: 'row10-key1',
key2: 'row10-key2',
key3: 'row10-key3',
key4: 'row10-key4',
key5: 'row10-key5',
key6: 'row10-key6',
key7: 'row10-key7',
key8: 'row10-key8',
key9: 'row10-key9',
key10: 'row10-key10',
key11: 'row10-key11',
key12: 'row10-key12',
},
{
id: '11',
key0: 'row11-key',
key1: 'row11-key1',
key2: 'row11-key2',
key3: 'row11-key3',
key4: 'row11-key4',
key5: 'row11-key5',
key6: 'row11-key6',
key7: 'row11-key7',
key8: 'row11-key8',
key9: 'row11-key9',
key10: 'row11-key10',
key11: 'row11-key11',
key12: 'row11-key12',
},
{
id: '12',
key0: 'row12-key',
key1: 'row12-key1',
key2: 'row12-key2',
key3: 'row12-key3',
key4: 'row12-key4',
key5: 'row12-key5',
key6: 'row12-key6',
key7: 'row12-key7',
key8: 'row12-key8',
key9: 'row12-key9',
key10: 'row12-key10',
key11: 'row12-key11',
key12: 'row12-key12',
},
{
id: '13',
key0: 'row13-key',
key1: 'row13-key1',
key2: 'row13-key2',
key3: 'row13-key3',
key4: 'row13-key4',
key5: 'row13-key5',
key6: 'row13-key6',
key7: 'row13-key7',
key8: 'row13-key8',
key9: 'row13-key9',
key10: 'row13-key10',
key11: 'row13-key11',
key12: 'row13-key12',
},
{
id: '14',
key0: 'row14-key',
key1: 'row14-key1',
key2: 'row14-key2',
key3: 'row14-key3',
key4: 'row14-key4',
key5: 'row14-key5',
key6: 'row14-key6',
key7: 'row14-key7',
key8: 'row14-key8',
key9: 'row14-key9',
key10: 'row14-key10',
key11: 'row14-key11',
key12: 'row14-key12',
},
{
id: '15',
key0: 'row15-key',
key1: 'row15-key1',
key2: 'row15-key2',
key3: 'row15-key3',
key4: 'row15-key4',
key5: 'row15-key5',
key6: 'row15-key6',
key7: 'row15-key7',
key8: 'row15-key8',
key9: 'row15-key9',
key10: 'row15-key10',
key11: 'row15-key11',
key12: 'row15-key12',
},
{
id: '16',
key0: 'row16-key',
key1: 'row16-key1',
key2: 'row16-key2',
key3: 'row16-key3',
key4: 'row16-key4',
key5: 'row16-key5',
key6: 'row16-key6',
key7: 'row16-key7',
key8: 'row16-key8',
key9: 'row16-key9',
key10: 'row16-key10',
key11: 'row16-key11',
key12: 'row16-key12',
},
{
id: '17',
key0: 'row17-key',
key1: 'row17-key1',
key2: 'row17-key2',
key3: 'row17-key3',
key4: 'row17-key4',
key5: 'row17-key5',
key6: 'row17-key6',
key7: 'row17-key7',
key8: 'row17-key8',
key9: 'row17-key9',
key10: 'row17-key10',
key11: 'row17-key11',
key12: 'row17-key12',
},
];
</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>