useHeights.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. var instance = new Map();
  11. var heights = new Map();
  12. var updatedMark = (0, _vue.ref)(Symbol('update'));
  13. (0, _vue.watch)(mergedData, function () {
  14. updatedMark.value = Symbol('update');
  15. });
  16. var collectRaf = undefined;
  17. function cancelRaf() {
  18. _raf.default.cancel(collectRaf);
  19. }
  20. function collectHeight() {
  21. cancelRaf();
  22. collectRaf = (0, _raf.default)(function () {
  23. instance.forEach(function (element, key) {
  24. if (element && element.offsetParent) {
  25. var offsetHeight = element.offsetHeight;
  26. if (heights.get(key) !== offsetHeight) {
  27. //changed = true;
  28. updatedMark.value = Symbol('update');
  29. heights.set(key, element.offsetHeight);
  30. }
  31. }
  32. });
  33. });
  34. }
  35. function setInstance(item, ins) {
  36. var key = getKey(item);
  37. var origin = instance.get(key);
  38. if (ins) {
  39. instance.set(key, ins.$el || ins);
  40. collectHeight();
  41. } else {
  42. instance.delete(key);
  43. }
  44. // Instance changed
  45. if (!origin !== !ins) {
  46. if (ins) {
  47. onItemAdd === null || onItemAdd === void 0 ? void 0 : onItemAdd(item);
  48. } else {
  49. onItemRemove === null || onItemRemove === void 0 ? void 0 : onItemRemove(item);
  50. }
  51. }
  52. }
  53. (0, _vue.onUnmounted)(function () {
  54. cancelRaf();
  55. });
  56. return [setInstance, collectHeight, heights, updatedMark];
  57. }