勾选 12 条后把状态筛成已完成,列表只剩 3 条,点批量提交,请求体里还是 12 个 id,其中 9 条已经不在当前视图。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

useEffect(() => {
  setSelected(prev => prev.filter(id => visibleIds.includes(id)));
}, [visibleIds]);

选中集合只增不减,筛选只改了展示的数据源,没有和选中集合求交集。用户看不到被选中的项,提交时仍然一起带上。这一点先确认清楚,后面就不用反复试。

「列表选中状态残留」这类改动最怕改一半,回滚脚本先准备好,再动生产。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

具体做法是,筛选条件变化时把选中集合与当前可见 id 求交集;全选只针对当前页 跨页累积要给明确提示;提交前再过滤一次 丢掉不可见的 id;筛完看请求体 确认只剩 3 个。

改完照着核一遍,筛选后提交,请求体里只有 3 个 id,与当前列表的勾选状态一致。

作者 9823189