micro-observables
micro-observables copied to clipboard
React hook useObservable and SSR warnings
When useObservable
is used in a Server Side rendering context, it raises a React warning:
Warning: useLayoutEffect does nothing on the server, because its effect cannot be encoded into the server renderer's output format. This will lead to a mismatch between the initial, non- hydrated UI and the intended UI. To avoid this, useLayoutEffect should only be used in components that render exclusively on the client. See https://reactjs.org/link/uselayouteffect-ssr for common fixes.
To avoid this, the solution described here could be easily applied: https://medium.com/@alexandereardon/uselayouteffect-and-ssr-192986cdcf7a
So for example, the code might look like this:
const useSsrCompatibleLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
export function useObservable<T>(observable: Observable<T>): T {
const [, forceRender] = useState({});
const val = observable.get();
useSsrCompatibleLayoutEffect(() => {
return observable.subscribe(() => forceRender({}));
}, [observable]);
return val;
}