-
-
Notifications
You must be signed in to change notification settings - Fork 43
This issue was moved to a discussion.
You can continue the conversation there. Go to discussion →
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Question regarding environments missing ResizeObserver #97
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. |
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 👍 |
Great, I'll leave this issue open until it's documented, I think it's an interesting use-case. |
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. |
Thanks for sharing! It seems like the idea behind it is already enough to nudge people in the right direction anyway. 👍 |
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: () => {
// ...
},
}) |
This issue was moved to a discussion.
You can continue the conversation there. Go to discussion →
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
new ResizeObserver
internally)?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.:
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.
The text was updated successfully, but these errors were encountered: