import { useCallback, useMemo, useState } from 'react'; /** * 选择、全选操作 * @param list - 需要进行选择的列表 * @return [选中的项, 设置选中的方法, 是否全选, 是否部分选中, 全选方法,是否单个选中,选中单个方法] */ export const useCheck = (list: T[]) => { const [selected, setSelected] = useState([]); const checked = useMemo(() => { return selected.length === list.length && selected.length > 0; }, [selected, list]); const indeterminate = useMemo(() => { return selected.length > 0 && selected.length < list.length; }, [selected, list]); const checkAll = useCallback(() => { setSelected(checked ? [] : list); }, [list, checked]); const isSingleChecked = useCallback((item: T) => selected.includes(item), [selected]); const checkSingle = useCallback( (item: T) => { setSelected((prev) => { if (isSingleChecked(item)) { return prev.filter((i) => i !== item); } else { return [...prev, item]; } }); }, [isSingleChecked], ); return [ selected, setSelected, checked, indeterminate, checkAll, isSingleChecked, checkSingle, ] as const; };