diff --git a/apps/web/src/pages/products/hooks/useProductList/useBatchSelection.ts b/apps/web/src/pages/products/hooks/useProductList/useBatchSelection.ts index 5de32c7e0..ee1301d35 100644 --- a/apps/web/src/pages/products/hooks/useProductList/useBatchSelection.ts +++ b/apps/web/src/pages/products/hooks/useProductList/useBatchSelection.ts @@ -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,