fix: 全选/取消全选仅操作当前可见项,避免筛选状态下数据丢失

This commit is contained in:
2026-07-30 00:57:57 +08:00
parent 6204d28780
commit e204b91102
@@ -1,4 +1,4 @@
import { useState } from "react"
import { useState, useCallback } from "react"
import type { ProductItem } from "../../types"
export const useBatchSelection = (filteredProducts: ProductItem[]) => {
@@ -9,15 +9,25 @@ export const useBatchSelection = (filteredProducts: ProductItem[]) => {
const allSelected =
filteredProducts.length > 0 && filteredProducts.every((p) => selectedIds.has(p.id))
const handleSelectAll = () => {
const handleSelectAll = useCallback(() => {
if (allSelected) {
setSelectedIds(new Set())
// 仅取消选中当前可见的项,保留筛选外的选中状态
setSelectedIds((prev) => {
const next = new Set(prev)
filteredProducts.forEach((p) => next.delete(p.id))
return next
})
} else {
setSelectedIds(new Set(filteredProducts.map((p) => p.id)))
// 选中所有当前可见项
setSelectedIds((prev) => {
const next = new Set(prev)
filteredProducts.forEach((p) => next.add(p.id))
return next
})
}
}
}, [allSelected, filteredProducts])
const handleToggleSelect = (id: string) => {
const handleToggleSelect = useCallback((id: string) => {
setSelectedIds((prev) => {
const next = new Set(prev)
if (next.has(id)) {
@@ -27,9 +37,9 @@ export const useBatchSelection = (filteredProducts: ProductItem[]) => {
}
return next
})
}
}, [])
const clearSelection = () => setSelectedIds(new Set())
const clearSelection = useCallback(() => setSelectedIds(new Set()), [])
return {
selectedIds,