UNPKG

1.3 kBJavaScriptView Raw
1import { useState } from 'react';
2import useEffect from './useIsomorphicEffect';
3var targetMap = new WeakMap();
4var resizeObserver;
5
6function getResizeObserver() {
7 // eslint-disable-next-line no-return-assign
8 return resizeObserver = resizeObserver || new window.ResizeObserver(function (entries) {
9 entries.forEach(function (entry) {
10 var handler = targetMap.get(entry.target);
11 if (handler) handler(entry.contentRect);
12 });
13 });
14}
15/**
16 * Efficiently observe size changes on an element. Depends on the `ResizeObserver` api,
17 * and polyfills are needed in older browsers.
18 *
19 * ```ts
20 * const [ref, attachRef] = useCallbackRef(null);
21 *
22 * const rect = useResizeObserver(ref);
23 *
24 * return (
25 * <div ref={attachRef}>
26 * {JSON.stringify(rect)}
27 * </div>
28 * )
29 * ```
30 *
31 * @param element The DOM element to observe
32 */
33
34
35export default function useResizeObserver(element) {
36 var _useState = useState(null),
37 rect = _useState[0],
38 setRect = _useState[1];
39
40 useEffect(function () {
41 if (!element) return;
42 getResizeObserver().observe(element);
43 setRect(element.getBoundingClientRect());
44 targetMap.set(element, function (rect) {
45 setRect(rect);
46 });
47 return function () {
48 targetMap.delete(element);
49 };
50 }, [element]);
51 return rect;
52}
\No newline at end of file