Question regarding environments missing ResizeObserver #110
-
I have a library where I don't necessarily want to polyfill ResizeObserver if a device is missing support, meaning I'd like to avoid calling useResizeObserver when ResizeObserver does not exist in DOM. Due to React semantics, I can't make the call to the hook conditional. Would it be reasonable to extend the hook with an option to disable resize detection when it isn't supported (e.g. by blocking calls to I know that I can add the hook to a conditionally rendered element in order to prevent it from running if ResizeObserver isn't in DOM, e.g.: { ("ResizeObserver" in window) && <SomeComponentWithResizeObserver callback={setSomeStateOnResize} /> } However, if my library only exports a hook and no component, that wouldn't be possible. I can create a PR if this sounds reasonable. |
Beta Was this translation helpful? Give feedback.
Replies: 6 comments
-
I think you might be able to achieve what you want with the current hook. This lazy-initialization was introduced for SSR compatibility initially, but could be used for this as follows: import useResizeObserverRaw = 'use-resize-observer';
const isRoAvailable = typeof window !== 'undefined' && ("ResizeObserver" in window);
export const useResizeObserver = () => {
const { ref: refRaw, with, height } = useResizeObserverRaw();
const ref = useCallback((element) => {
if (isRoAvailable) { refRaw(element); }
}, [refRaw, isRoAvailable]);
return useMemo(() => ({ref, width, height}), [ref, width, height])
} Then you'd use this hook as usual: const { ref, width = 42, height = 24 } = useResizeObserver(); ☝️ Where the default values would be used when no RO is available. I'm a bit unsure how this would work with SSR, but I think when hydration happens it would call the ref passed in with the new Hope this helps. |
Beta Was this translation helpful? Give feedback.
-
Thanks @ZeeCoder, that's great to know. I should have looked more closely at the source. I don't expect this to be a very common usecase, but could be useful to have this behaviour documented 👍 |
Beta Was this translation helpful? Give feedback.
-
Great, I'll leave this issue open until it's documented, I think it's an interesting use-case. |
Beta Was this translation helpful? Give feedback.
-
I'm using the inverted version where I'm passing a ref into the hook, seems to work in an even easier manner: delete window.ResizeObserver;
// ...
useResizeObserver({
ref: null,
onResize: () => {
// ...
},
}); Triggers no error. |
Beta Was this translation helpful? Give feedback.
-
Thanks for sharing! It seems like the idea behind it is already enough to nudge people in the right direction anyway. 👍 |
Beta Was this translation helpful? Give feedback.
-
I just used Real code example would be something like: useResizeObserver({
// prevent crashing in environments that do not support ResizeObserver
ref: isRoAvailable ? someRef : null,
onResize: () => {
// ...
},
}) |
Beta Was this translation helpful? Give feedback.
I think you might be able to achieve what you want with the current hook.
When you don't pass in an element to to hook to be observed, then the hook doesn't create an RO instance, and therefore won't need a polyfill either up until that point.
This lazy-initialization was introduced for SSR compatibility initially, but could be used for this as follows: