UNPKG

2.75 kBJavaScriptView Raw
1import { canUseDOM } from './util';
2/**
3 * This function creates a ResizeObserver used to handle resize events for the given containerRef. If ResizeObserver
4 * or the given containerRef are not available, a window resize event listener is used by default.
5 *
6 * Example 1:
7 *
8 * private containerRef = React.createRef<HTMLDivElement>();
9 * private observer: any = () => {};
10 *
11 * public componentDidMount() {
12 * this.observer = getResizeObserver(this.containerRef.current, this.handleResize);
13 * }
14 *
15 * public componentWillUnmount() {
16 * this.observer();
17 * }
18 *
19 * private handleResize = () => {
20 * if (this.containerRef.current && this.containerRef.current.clientWidth) {
21 * this.setState({ width: this.containerRef.current.clientWidth });
22 * }
23 * };
24 *
25 * public render() {
26 * return (
27 * <div ref={this.containerRef} >
28 * <Chart width={this.state.width} ... />
29 * </div>
30 * );
31 * }
32 *
33 * Example 2:
34 *
35 * private inputRef = React.createRef<HTMLInputElement>();
36 * private observer: any = () => {};
37 *
38 * public componentDidMount() {
39 * this.observer = getResizeObserver(this.inputRef.current, this.handleResize);
40 * }
41 *
42 * public componentWillUnmount() {
43 * this.observer();
44 * }
45 *
46 * private handleResize = () => {
47 * if (this.inputRef.current) {
48 * trimLeft(inputRef.current, String(this.props.value));
49 * }
50 * };
51 *
52 * public render() {
53 * return (
54 * <input ref={this.inputRef} ... />
55 * );
56 * }
57 *
58 * @param {Element} containerRefElement The container reference to observe
59 * @param {Function} handleResize The function to call for resize events
60 * @return {Function} The function used to unobserve resize events
61 */
62export const getResizeObserver = (containerRefElement, handleResize) => {
63 let unobserve;
64 if (canUseDOM) {
65 const { ResizeObserver } = window;
66 if (containerRefElement && ResizeObserver) {
67 const resizeObserver = new ResizeObserver((entries) => {
68 // Wrap resize function in requestAnimationFrame to avoid "ResizeObserver loop limit exceeded" errors
69 window.requestAnimationFrame(() => {
70 if (Array.isArray(entries) && entries.length > 0) {
71 handleResize();
72 }
73 });
74 });
75 resizeObserver.observe(containerRefElement);
76 unobserve = () => resizeObserver.unobserve(containerRefElement);
77 }
78 else {
79 window.addEventListener('resize', handleResize);
80 unobserve = () => window.removeEventListener('resize', handleResize);
81 }
82 }
83 return () => {
84 if (unobserve) {
85 unobserve();
86 }
87 };
88};
89//# sourceMappingURL=resizeObserver.js.map
\No newline at end of file