
在开发一个充电站订单管理系统时,我遇到了一个奇怪的问题:表格初始化时能正确筛选出type=6(充电订单)的数据,但点击刷新按钮后,筛选条件失效,显示了所有类型的订单。
type=6的充电订单

const hqTable = new hqTableClass(
new hqTableApi("/pcs/order"),
{
filter: {
search: [
{
field: "type",
operator: "LIKE",
val: "6", // 明确设置只显示充电订单
},
],
},
// ... 其他配置
}
);在hqTableClass的getIndex方法中:
getIndex = () => {
const params: any = {}
if (this.table.filter) {
this.table.filter.search &&
this.table.filter.search.map((item) => {
params[item.field] = item.val // 简单映射,没有保护机制
})
}
// ... 发送请求
}筛选条件存储在响应式对象中,容易被意外修改:
this.table.filter.search = [...] // 没有保护机制TableHeader组件的刷新操作:
'refresh': () => {
this.table.data = [] // 清空数据
this.getIndex() // 重新获取,但可能用错误的筛选条件
}getIndex方法每次重新构建参数,没有确保初始筛选条件的持久性。
// 保护性重写,确保筛选条件始终有效
const originalGetIndex = hqTable.getIndex;
hqTable.getIndex = function() {
// 确保type=6筛选条件存在
if (!this.table.filter.search.some(item => item.field === 'type')) {
this.table.filter.search.push({
field: "type", operator: "LIKE", val: "6"
});
}
return originalGetIndex.call(this);
};// 响应式保护,防止筛选条件被意外清除
watch(() => hqTable.table.filter.search, (newSearch) => {
if (!newSearch?.some(item => item.field === 'type')) {
hqTable.table.filter.search.push({
field: "type", operator: "LIKE", val: "6"
});
}
}, { deep: true });// 不好的写法:假设筛选条件永远存在
params[item.field] = item.val
// 好的写法:添加保护性检查
if (item && item.field && item.val !== undefined) {
params[item.field] = item.val
}validateTableState() {
if (!this.table.filter.search) {
this.table.filter.search = []
}
// 确保必要的筛选条件存在
}safeRefresh() {
this.validateTableState()
this.onTableHeaderAction('refresh', {})
}您好,我是肥晨。
欢迎关注我获取前端学习资源,日常分享技术变革,生存法则;行业内幕,洞察先机。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。