构建动态交叉表

一、概述

在数据分析和信息管理领域,交叉表(Cross-tabulation),也称为交叉矩阵表或条件表,是一种强大的数据展示工具。它允许用户以表格的形式,通过行和列的交叉点来观察不同变量之间的关系。。裁床单信息管理是一个典型的例子,它需要展示不同颜色和尺寸的裁床单数量。本文将通过一个Vue 3和Ant Design Vue的实践案例,详细介绍如何构建一个动态交叉表来管理裁床单信息。

二、交叉表实现

(1)模板编写在Vue组件中,使用Ant Design Vue的组件来构建用户界面。这包括一个模态框(<a-modal>),一个表单(<a-form>),以及一个表格(<a-table>)。

<template>

<a-modal :open="visibleFlag" ...>

<a-form ref="formRef" :model="form" :rules="rules" ...>

<!-- 表单内容 -->

</a-form>

<a-table :dataSource="groupedDetails" :columns="columns" bordered>

<template #customRenderCell="{ record }">

{{record.data.details.num}}

</template>

</a-table>

<template #footer>

<!-- 操作按钮 -->

</template>

</a-modal>

</template>

2)脚本设置:使用Vue的Composition API来管理状态和逻辑。这包括响应式状态(reactive)、引用(ref)、延迟执行(nextTick)和观察者(watch)。

<script setup>

import { reactive, ref, nextTick, watch } from 'vue';

import { message } from 'ant-design-vue';

// 其他导入...

const form = reactive({ /* 表单默认值 */ });

const groupedDetails = ref([]);

const columns = ref([]);

// 其他状态定义...

</script>

(3)数据初始化实现 initTable 函数来初始化交叉表的列和数据。动态列和分组数据的生成是此函数的关键部分。

  • 列是根据数据中的尺寸和颜色动态生成的。

  • 动态列和分组数据:

使用 reduce 方法对数据进行分组,以填充交叉表的单元。function initTable() {

columns.value = [{

title: '颜色',

dataIndex: 'styleColor',

key: 'styleColor',

width: 100,

}];

// 动态添加列

sizes.value.forEach(size => {

columns.value.push({

title: size,

dataIndex: size,

key: size,

scopedSlots: { customRender: 'customRenderCell' },

});

});

// 根据颜色分组数据

groupedDetails.value = colors.value.reduce((acc, color) => {

const groupedBySize = groupedDetails.value

.filter(item => item.styleColor === color)

.reduce((sizeAcc, item) => {

sizeAcc[item.size] = item.num;

return sizeAcc;

}, {});

acc.push({

styleColor: color,

...groupedBySize,

});

return acc;

}, []);

(4)数据获取通过 fetchDetailsData 异步获取数据,并初始化交叉表。这包括调用API,处理返回的数据,并调用initTable来更新表格。

async function fetchDetailsData() {

const response = await cutBedSheetApi.viewDetails(Id.value);

if (response && response.data && response.data.details) {

groupedDetails.value = response.data.details;

sizes.value = Array.from(new Set(groupedDetails.value.map(item => item.size)));

colors.value = Array.from(new Set(groupedDetails.value.map(item => item.styleColor))); initTable();

} else { message.error('获取数据失败:' + (response.msg || '')); } }

(5)观察者模式

 使用 watch 监听数据ID的变化,以重新获取和展示数据:

 watch(Id, (newVal) => {

if (newVal !== null) {

 fetchDetailsData();

 }

 });

三、数据驱动

交叉表的数据来源于后端API,通过fetchDetailsData函数获取并动态构建列和行数据。这种数据驱动的方式确保了表格内容的实时性和准确性。

四、结论

本文详细介绍了如何使用Vue 3和Ant Design Vue构建一个动态交叉表来管理裁床单信息。通过动态交叉表,我们能够展示不同颜色和尺寸的裁床单数量。

五、效果


构建动态交叉表
http://localhost:8090//archives/gou-jian-dong-tai-jiao-cha-biao
作者
L
发布于
2024年08月12日
许可协议