You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

useCheck.ts 1.2 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { useCallback, useMemo, useState } from 'react';
  2. /**
  3. * 选择、全选操作
  4. * @param list - 需要进行选择的列表
  5. * @return [选中的项, 设置选中的方法, 是否全选, 是否部分选中, 全选方法,是否单个选中,选中单个方法]
  6. */
  7. export const useCheck = <T>(list: T[]) => {
  8. const [selected, setSelected] = useState<T[]>([]);
  9. const checked = useMemo(() => {
  10. return selected.length === list.length && selected.length > 0;
  11. }, [selected, list]);
  12. const indeterminate = useMemo(() => {
  13. return selected.length > 0 && selected.length < list.length;
  14. }, [selected, list]);
  15. const checkAll = useCallback(() => {
  16. setSelected(checked ? [] : list);
  17. }, [list, checked]);
  18. const isSingleChecked = useCallback((item: T) => selected.includes(item), [selected]);
  19. const checkSingle = useCallback(
  20. (item: T) => {
  21. setSelected((prev) => {
  22. if (isSingleChecked(item)) {
  23. return prev.filter((i) => i !== item);
  24. } else {
  25. return [...prev, item];
  26. }
  27. });
  28. },
  29. [isSingleChecked],
  30. );
  31. return [
  32. selected,
  33. setSelected,
  34. checked,
  35. indeterminate,
  36. checkAll,
  37. isSingleChecked,
  38. checkSingle,
  39. ] as const;
  40. };