vue过滤表格数据导致的索引错乱问题

问题描述:

在一个表单中有一个表格需要操作筛选和编辑

我用tableData.filter(filterEditTable)过滤了表格数据,在过滤后的表格数据中进行编辑或删除操作时,直接使用过滤后数组的索引(filterEditTable 的索引)会导致操作错误,因为这个索引并不对应原始数据源(tableData)的位置

解决方案:

保持数据源(tableData)的完整性,只通过控制表格的显示属性来过滤,处理"编辑/删除"和"筛选"共存场景。

实现:

javascript 复制代码
<el-table 
    :data="tableData" 
    :row-class-name="tableRowClassName">
    <!-- 列定义... -->
</el-table>
javascript 复制代码
methods: {
    // 动态添加类名
    tableRowClassName({row}) {
        // 如果不满足筛选条件,添加 'hidden-row' 类
        if (!row.name.includes(this.searchKeyword)) {
            return 'hidden-row';
        }
        return '';
    },
    handleDelete(index) {
        // 这里的 index 直接对应 form.detailsList 的索引,非常安全!
        this.tableData.splice(index, 1);
    }
}
javascript 复制代码
/* 隐藏行的 CSS */
/* 必须加 ::v-deep (或者 /deep/ 或 >>>) */
::v-deep .el-table .hidden-row {
    display: none !important; /* 加上 !important 强制覆盖 */
}

这样做的好处

  1. 索引准确:scope.$index 永远指向 tableData的真实位置,删除和编辑不会错位。

  2. 数据不丢失:筛选只是"视觉上的隐藏",数据依然存在于内存中,用户切换筛选条件后数据还在。

  3. 新增行处理简单:新增的行直接 push 进 tableData,表格会自动渲染,如果它符合筛选条件就会自动显示,不符合就自动隐藏,无需额外逻辑。

相关推荐
小码哥_常8 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮11 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
她说可以呀12 小时前
Vue插槽
前端·javascript·vue.js
qq_4480111612 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan12 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_9583529013 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
志尊宝14 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
FRing0314 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
excel15 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放15 小时前
Python基础语法练习题(73)
java·前端·python