Skip to content

Instantly share code, notes, and snippets.

@hi-ogawa
Created August 29, 2022 07:50
Show Gist options
  • Save hi-ogawa/c5faa355ad52797ecf4bbfb7161afab7 to your computer and use it in GitHub Desktop.
Save hi-ogawa/c5faa355ad52797ecf4bbfb7161afab7 to your computer and use it in GitHub Desktop.
useResizeObserverCallback.ts
function useResizeObserverCallback(callback: ResizeObserverCallback) {
const observerRef = React.useRef<ResizeObserver>();
const callbackStable = React.useRef(callback);
callbackStable.current = callback;
// return ref callback to setup/teardown the effect
return function refCallback(el: Element | null) {
let observer = observerRef.current;
// teardown
if (!el) {
if (observer) {
observer.disconnect();
}
observerRef.current = undefined;
return;
}
// setup
if (observer) {
observer.disconnect();
}
observer = new ResizeObserver((...args) => {
callbackStable.current(...args);
});
observer.observe(el);
observerRef.current = observer;
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment