useHeights.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { onUnmounted, watch, ref } from 'vue';
  2. import wrapperRaf from '../../_util/raf';
  3. export default function useHeights(mergedData, getKey, onItemAdd, onItemRemove) {
  4. var instance = new Map();
  5. var heights = new Map();
  6. var updatedMark = ref(Symbol('update'));
  7. watch(mergedData, function () {
  8. updatedMark.value = Symbol('update');
  9. });
  10. var collectRaf = undefined;
  11. function cancelRaf() {
  12. wrapperRaf.cancel(collectRaf);
  13. }
  14. function collectHeight() {
  15. cancelRaf();
  16. collectRaf = wrapperRaf(function () {
  17. instance.forEach(function (element, key) {
  18. if (element && element.offsetParent) {
  19. var offsetHeight = element.offsetHeight;
  20. if (heights.get(key) !== offsetHeight) {
  21. //changed = true;
  22. updatedMark.value = Symbol('update');
  23. heights.set(key, element.offsetHeight);
  24. }
  25. }
  26. });
  27. });
  28. }
  29. function setInstance(item, ins) {
  30. var key = getKey(item);
  31. var origin = instance.get(key);
  32. if (ins) {
  33. instance.set(key, ins.$el || ins);
  34. collectHeight();
  35. } else {
  36. instance.delete(key);
  37. }
  38. // Instance changed
  39. if (!origin !== !ins) {
  40. if (ins) {
  41. onItemAdd === null || onItemAdd === void 0 ? void 0 : onItemAdd(item);
  42. } else {
  43. onItemRemove === null || onItemRemove === void 0 ? void 0 : onItemRemove(item);
  44. }
  45. }
  46. }
  47. onUnmounted(function () {
  48. cancelRaf();
  49. });
  50. return [setInstance, collectHeight, heights, updatedMark];
  51. }