ids.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { debounce, diffArrayChange } from "@/utils";
  2. import { computed, ref, Ref, watch } from "vue";
  3. export const useSelects = <T extends { id: any }>(items: Ref<T[]>, test = false) => {
  4. const selects = ref<T[]>([]);
  5. const updateSelect = (item: T, select: boolean) => {
  6. const ndx = selects.value.findIndex((s) => s.id === item.id);
  7. test && console.log('updateSelect', item.id, select)
  8. if (select) {
  9. if (~ndx) {
  10. selects.value[ndx] = item as any
  11. } else {
  12. selects.value.push(item as any);
  13. }
  14. } else {
  15. ~ndx && selects.value.splice(ndx, 1);
  16. }
  17. };
  18. const updateSelectId = (id: any, select: boolean) => {
  19. const item = items.value.find((s) => s.id === id);
  20. if (item) {
  21. updateSelect(item, select);
  22. } else {
  23. const ndx = selects.value.findIndex((s) => s.id === id);
  24. if (~ndx) {
  25. selects.value.splice(ndx, 1);
  26. }
  27. }
  28. };
  29. const oldItems: T[] = [];
  30. watch(
  31. items,
  32. (items) => {
  33. const { added, deleted } = diffArrayChange(
  34. items.map((item) => item.id),
  35. oldItems.map((item) => item.id)
  36. );
  37. // test && console.error('added', added)
  38. // test && console.error('deleted', deleted)
  39. added.forEach((id) => updateSelectId(id, true));
  40. deleted.forEach((id) => updateSelectId(id, false));
  41. oldItems.length = 0;
  42. oldItems.push(...items);
  43. },
  44. { deep: true, flush: 'post' }
  45. );
  46. return {
  47. selects,
  48. unSelects: computed(() => items.value.filter(item => !selects.value.find(s => s.id === item.id))),
  49. all: computed({
  50. get: () => items.value.length === selects.value.length,
  51. set: (select: boolean) => {
  52. test && console.error('select', select)
  53. items.value.forEach(item => updateSelect(item, select))
  54. }
  55. }),
  56. include: (id: string) => selects.value.some(item => item.id === id),
  57. updateSelect,
  58. updateSelectId,
  59. };
  60. };