Skip to content

Instantly share code, notes, and snippets.

@jeffellis
Created July 16, 2020 18:24
Show Gist options
  • Save jeffellis/6b0b3bcddc4ddfd189b0a24b12ada1df to your computer and use it in GitHub Desktop.
Save jeffellis/6b0b3bcddc4ddfd189b0a24b12ada1df to your computer and use it in GitHub Desktop.
React hook for using a single ResizeObserver for multiple subscriptions
import React from 'react';
import ResizeObserver from 'resize-observer-polyfill';
let resizeObserver;
const subscriptions = {};
const onResizeCallback = elements => {
elements.forEach(element => {
const id = element.target.id;
const callback = subscriptions[id] && subscriptions[id].callback;
callback && callback(element);
});
};
const getResizeObserver = () => {
if (!resizeObserver) {
resizeObserver = new ResizeObserver(onResizeCallback);
}
return resizeObserver;
};
const observe = (element, callback) => {
if (!element.id) {
console.error(
'useResizeObserver: supplied element must have a unique id ',
element,
);
return;
}
getResizeObserver().observe(element);
subscriptions[element.id] = {
callback,
element,
};
};
const unobserve = element => {
getResizeObserver().unobserve(element);
delete subscriptions[element.id];
};
const useResizeObserver = () => {
return [observe, unobserve];
};
export default useResizeObserver;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment