// 数据 const getTotalBeforeData = function () { axiosPost("/user/total/SearchByDateAndName", param, t).then((res) => { // 表头名 const s1 = res.data.data.tableName.map((header: any, index: any) => ({ title: header, dataIndex: header, key: header, fixed: index < 6 ? "left" : undefined, // 固定前6列 width: index === 0 ? 50 : index === 2 ? 350 : 140, // 设置列宽 onHeaderCell: () => ({ style: { backgroundColor:'#769fcd' } }) }) ) s1[0].title = "no" setColumns(s1) // 表内容 for (let index = 0; index < res.data.data.tableData.length; index++) { res.data.data.tableData[index].id = index + 1 } setDataSource(res.data.data.tableData) // 合计 const length = s1.length let s2: any = [] var totalKeys = Object.keys(res.data.data.statistics) var totalValues = Object.values(res.data.data.statistics) for (let index = 3; index < s1.length; index++) { for (let i = 0; i < totalKeys.length; i++) { const totalKey = totalKeys[i]; const totalValue = totalValues[i]; if (totalKey == s1[index].key) { s2.push(totalValue); } } } setItems(s2) }); }var param: any = { date: '', name: [] }我的date需要经过一次处理再作为参数传给后端,需要加上-01
时间: 2025-04-07 18:17:59 浏览: 26
从你的代码可以看出,`getTotalBeforeData` 函数负责从前端获取数据并设置表格相关的状态变量。其中 `param.date` 是需要处理后再传递给后端的关键部分。
下面是一个完整的解决方案:
---
### 修改后的代码示例
```javascript
const handleDate = (dateString) => {
if (!dateString || typeof dateString !== 'string') {
throw new Error("请输入合法的日期字符串");
}
// 检查是否已经是正确的格式(YYYY-MM-DD)
const regex = /^\d{4}-\d{2}$/;
if (regex.test(dateString)) {
return `${dateString}-01`; // 直接补充 "-01"
} else {
throw new Error("日期格式应为 YYYY-MM");
}
};
// 数据
const getTotalBeforeData = function () {
try {
// 假设 param 已经初始化完成
if (param.date) {
param.date = handleDate(param.date); // 处理 date 字段
}
axiosPost("/user/total/SearchByDateAndName", param, t).then((res) => {
// 表头名
const s1 = res.data.data.tableName.map((header: any, index: any) => ({
title: header,
dataIndex: header,
key: header,
fixed: index < 6 ? "left" : undefined, // 固定前6列
width: index === 0 ? 50 : index === 2 ? 350 : 140, // 设置列宽
onHeaderCell: () => ({
style: { backgroundColor: '#769fcd' },
}),
}));
s1[0].title = "no"; // 第一列表头改为 no
setColumns(s1);
// 表内容
for (let index = 0; index < res.data.data.tableData.length; index++) {
res.data.data.tableData[index].id = index + 1; // 给每行增加 id 属性
}
setDataSource(res.data.data.tableData);
// 合计
const length = s1.length;
let s2: any = [];
var totalKeys = Object.keys(res.data.data.statistics);
var totalValues = Object.values(res.data.data.statistics);
for (let index = 3; index < s1.length; index++) {
for (let i = 0; i < totalKeys.length; i++) {
const totalKey = totalKeys[i];
const totalValue = totalValues[i];
if (totalKey === s1[index].key) {
s2.push(totalValue);
}
}
}
setItems(s2);
}).catch((err) => {
console.error("请求失败:", err.message || err);
});
} catch (error) {
console.error(error.message); // 处理日期格式化异常
}
};
```
---
### 关键点解析
#### 1. **日期字段处理函数** (`handleDate`)
我们封装了一个单独的函数用于处理日期字段:
- 如果 `date` 的值为空或者不是有效字符串,则抛出错误提示;
- 使用正则表达式匹配日期格式为 `YYYY-MM`;
- 若符合条件,则直接拼接 `-01` 返回新的日期字符串;否则报错提醒开发者输入有误。
#### 2. **异常捕获**
由于涉及到对用户输入的数据进行加工(如 `param.date`),因此增加了两层异常捕捉机制:
- 在外部包裹一层全局 `try...catch`,防止因参数问题导致程序崩溃;
- 内部 `axios.post()` 请求也加入了 `.catch()` 来拦截网络错误或服务端返回的问题。
#### 3. **其他细节优化**
- 确保所有循环遍历都基于实际业务需求调整条件边界;
- 动态生成表头样式及宽度配置时采用三元运算符简化逻辑判断;
- 提取公共变量命名清晰明了以便维护代码结构。
---
### 示例运行流程说明
假设有如下初始状态:
```javascript
var param = {
date: "2023-10",
name: ["张三"]
};
```
执行过程会依次经历以下几个阶段:
1. 调整 `param.date` 成 `"2023-10-01"` 形式提交至后台接口 `/user/total/SearchByDateAndName`;
2. 接收响应结果构造 Ant Design Table 所需的 columns 和 dataSource 结构体;
3. 最终展示合计项信息存入 state 变量供组件渲染使用。
---
### 注意事项
如果遇到类似场景还可以借助 moment.js/day.js 等工具库进一步提升效率和鲁棒性!
阅读全文
相关推荐






