observerUtil.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import ResizeObserver from 'resize-observer-polyfill';
  2. // =============================== Const ===============================
  3. var elementListeners = new Map();
  4. function onResize(entities) {
  5. entities.forEach(function (entity) {
  6. var _elementListeners$get;
  7. var target = entity.target;
  8. (_elementListeners$get = elementListeners.get(target)) === null || _elementListeners$get === void 0 || _elementListeners$get.forEach(function (listener) {
  9. return listener(target);
  10. });
  11. });
  12. }
  13. // Note: ResizeObserver polyfill not support option to measure border-box resize
  14. var resizeObserver = new ResizeObserver(onResize);
  15. // Dev env only
  16. export var _el = process.env.NODE_ENV !== 'production' ? elementListeners : null; // eslint-disable-line
  17. export var _rs = process.env.NODE_ENV !== 'production' ? onResize : null; // eslint-disable-line
  18. // ============================== Observe ==============================
  19. export function observe(element, callback) {
  20. if (!elementListeners.has(element)) {
  21. elementListeners.set(element, new Set());
  22. resizeObserver.observe(element);
  23. }
  24. elementListeners.get(element).add(callback);
  25. }
  26. export function unobserve(element, callback) {
  27. if (elementListeners.has(element)) {
  28. elementListeners.get(element).delete(callback);
  29. if (!elementListeners.get(element).size) {
  30. resizeObserver.unobserve(element);
  31. elementListeners.delete(element);
  32. }
  33. }
  34. }