useHeights.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = useHeights;
  7. var _vue = require("vue");
  8. var _raf = _interopRequireDefault(require("../../_util/raf"));
  9. function useHeights(mergedData, getKey, onItemAdd, onItemRemove) {
  10. const instance = new Map();
  11. const heights = new Map();
  12. const updatedMark = (0, _vue.ref)(Symbol('update'));
  13. (0, _vue.watch)(mergedData, () => {
  14. updatedMark.value = Symbol('update');
  15. });
  16. let collectRaf = undefined;
  17. function cancelRaf() {
  18. _raf.default.cancel(collectRaf);
  19. }
  20. function collectHeight() {
  21. cancelRaf();
  22. collectRaf = (0, _raf.default)(() => {
  23. instance.forEach((element, key) => {
  24. if (element && element.offsetParent) {
  25. const {
  26. offsetHeight
  27. } = element;
  28. if (heights.get(key) !== offsetHeight) {
  29. //changed = true;
  30. updatedMark.value = Symbol('update');
  31. heights.set(key, element.offsetHeight);
  32. }
  33. }
  34. });
  35. });
  36. }
  37. function setInstance(item, ins) {
  38. const key = getKey(item);
  39. const origin = instance.get(key);
  40. if (ins) {
  41. instance.set(key, ins.$el || ins);
  42. collectHeight();
  43. } else {
  44. instance.delete(key);
  45. }
  46. // Instance changed
  47. if (!origin !== !ins) {
  48. if (ins) {
  49. onItemAdd === null || onItemAdd === void 0 ? void 0 : onItemAdd(item);
  50. } else {
  51. onItemRemove === null || onItemRemove === void 0 ? void 0 : onItemRemove(item);
  52. }
  53. }
  54. }
  55. (0, _vue.onUnmounted)(() => {
  56. cancelRaf();
  57. });
  58. return [setInstance, collectHeight, heights, updatedMark];
  59. }