AG-GRID批量删除选中行时每次仅删除27条如何解决?
问题产生原因
- 引用联动导致遍历丢失:你代码中使用的
selectedItems如果是AG-GRID直接返回的选中集合引用,调用node.setSelected(false)时,AG-GRID会实时从selectedItems中移除对应节点,数组长度动态缩短,导致includes判断漏过大量未处理的ID。 - 行虚拟化导致节点不全:AG-GRID默认开启行虚拟化优化,仅渲染视口范围内的行,如果你获取的
allItems是通过getRenderedNodes()返回的已渲染节点,默认只会返回当前可见的20-30行(对应你碰到的每次处理27条的情况),非视口的节点没有被遍历到。
修复方案
先对需要处理的ID生成独立快照,再用AG-GRID官方全节点遍历API处理,不受虚拟化和动态集合的影响,代码示例如下:
// 1. 生成目标ID的独立快照,用Set提升查询效率,切断和AG-GRID动态集合的联动 const targetIdSet = new Set(selectedItems.map(item => item.id)); // 2. 用官方API遍历全量节点,覆盖所有行不受虚拟化限制 gridApi.forEachNode(node => { if (targetIdSet.has(node.data.id)) { // 第二个参数设为false,关闭单次修改的事件触发,避免批量操作时的性能损耗 node.setSelected(false, false); } }); // 若你的实际需求是直接删除行而非取消选中,可直接用批量事务API,无需遍历: // const deleteRows = selectedItems.map(item => ({id: item.id})); // gridApi.applyTransaction({ remove: deleteRows });
内容的提问来源于stack exchange,提问作者UnskilledCoder
相关产品推荐
相关产品推荐

