ids.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { 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. console.error('select', item.id, select)
  7. const ndx = selects.value.findIndex((s) => s.id === item.id);
  8. if (select) {
  9. ~ndx || selects.value.push(item as any);
  10. } else {
  11. ~ndx && selects.value.splice(ndx, 1);
  12. }
  13. };
  14. const updateSelectId = (id: any, select: boolean) => {
  15. console.log('===>', [...items.value], id, select)
  16. const item = items.value.find((s) => s.id === id);
  17. console.log('===>', item)
  18. if (item) {
  19. updateSelect(item, select);
  20. } else {
  21. const ndx = selects.value.findIndex((s) => s.id === id);
  22. if (~ndx) {
  23. selects.value.splice(ndx, 1);
  24. }
  25. }
  26. };
  27. const oldItems: T[] = [];
  28. watch(
  29. items,
  30. (items) => {
  31. const { added, deleted } = diffArrayChange(
  32. items.map((item) => item.id),
  33. oldItems.map((item) => item.id)
  34. );
  35. console.error([...items], 'itemChange', added, deleted)
  36. added.forEach((id) => updateSelectId(id, true));
  37. deleted.forEach((id) => updateSelectId(id, false));
  38. oldItems.length = 0;
  39. oldItems.push(...items);
  40. },
  41. { deep: true }
  42. );
  43. return {
  44. selects,
  45. unSelects: computed(() => items.value.filter(item => !selects.value.includes(item as any))),
  46. all: computed({
  47. get: () => items.value.length === selects.value.length,
  48. set: (select: boolean) => {
  49. console.error('select', select)
  50. items.value.forEach(item => updateSelect(item, select))
  51. }
  52. }),
  53. include: (id: string) => selects.value.some(item => item.id === id),
  54. updateSelect,
  55. updateSelectId,
  56. };
  57. };