批量操作时如何正确管理选中状态?
我在做列表的批量删除功能,但选中状态总是同步不上,点全选后有些项没反应。
我用的是React的useState来存选中的ID数组,但更新的时候好像有状态滞后的问题。比如下面这段代码:
const [selectedIds, setSelectedIds] = useState([]);
const toggleSelect = (id) => {
if (selectedIds.includes(id)) {
setSelectedIds(selectedIds.filter(item => item !== id));
} else {
setSelectedIds([...selectedIds, id]);
}
};
const selectAll = () => {
const allIds = list.map(item => item.id);
setSelectedIds(allIds);
};
有时候点“全选”之后,界面上的复选框没全部勾上,但selectedIds里明明已经有所有ID了,这是为啥?
你代码的问题在于直接使用了
selectedIds这个变量,而不是用函数式更新。连续快速操作时,React的setState会批量处理,导致你拿到的可能是旧值。改用函数式更新就能解决:
用
prev参数就能拿到最新状态,甭管之前有什么异步问题。另外关于"全选后复选框没勾上"这个现象,如果
selectedIds确实有值但UI没更新,大概率是你的checkbox的checked属性没写对。应该是:很多人会写成
defaultChecked或者用checked={isSelected}这种中间状态,那就完蛋了。全选按钮那边也注意一下:
基本上改完这两处就OK了。