ids.ts 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { diffArrayChange } from "@/utils";
  2. import { ref, Ref, watch } from "vue";
  3. export const useSelects = <T extends { id: any }>(items: Ref<T[]>) => {
  4. const selects = ref<T[]>([]);
  5. const updateSelect = (item: T, select: boolean) => {
  6. const ndx = selects.value.findIndex((s) => s.id === item.id);
  7. if (select) {
  8. ~ndx || selects.value.push(item as any);
  9. } else {
  10. ~ndx && selects.value.splice(ndx, 1);
  11. }
  12. };
  13. const updateSelectId = (id: any, select: boolean) => {
  14. const item = items.value.find((s) => s.id === id);
  15. item && updateSelect(item, select);
  16. };
  17. const oldItems: T[] = [];
  18. watch(
  19. items,
  20. (items) => {
  21. const { added, deleted } = diffArrayChange(
  22. items.map((item) => item.id),
  23. oldItems.map((item) => item.id)
  24. );
  25. added.forEach((id) => updateSelectId(id, true));
  26. deleted.forEach((id) => updateSelectId(id, false));
  27. oldItems.length = 0;
  28. oldItems.push(...items);
  29. },
  30. { deep: true }
  31. );
  32. return {
  33. selects,
  34. updateSelect,
  35. updateSelectId,
  36. };
  37. };