fix: 全选/取消全选仅操作当前可见项,避免筛选状态下数据丢失
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user