@@ -64,34 +64,50 @@ useComponentSize(ref, { ResizeObserver });
64
64
65
65
If you are using Webpack (or similar) you could use [ dynamic
66
66
imports] ( https://webpack.js.org/api/module-methods/#import ) , to load the
67
- Polyfill only if needed. A basic implementation could look something like this:
67
+ Polyfill only if needed. A basic implementation in your component could look
68
+ something like this:
68
69
69
70
``` js
70
- function getResizeObserver () {
71
- if (
72
- ' ResizeObserver' in global &&
73
- ' ResizeObserverEntry' in global &&
74
- ' contentRect' in ResizeObserverEntry .prototype
75
- ) {
76
- return Promise .resolve (ResizeObserver);
71
+ // GetResizeObserver.js
72
+ // Ponyfill, not polyfill, since we're not chaging the global
73
+ // `window.ResizeObserver` variable
74
+ let ResizeObserverPonyfill;
75
+
76
+ export async function getResizeObserverOrPonyfill () {
77
+ const BuiltinResizeObserver = window .ResizeObserver ;
78
+ if (BuiltinResizeObserver) {
79
+ return BuiltinResizeObserver;
77
80
}
78
- return import (' resize-observer-polyfill' );
81
+ ResizeObserverPonyfill = (await import (" resize-observer-polyfill" )).default ;
82
+ return ResizeObserverPonyfill;
79
83
}
84
+
80
85
```
81
86
82
- And in your component:
83
87
``` js
84
- const [ResizeObserverApi , setResizeObserverApi ] = setState ();
88
+ const [ResizeObserver , setResizeObserver ] = useState (
89
+ window .ResizeObserver );
90
+
85
91
useEffect (() => {
92
+ if (ResizeObserver) {
93
+ return ; // don't need to load the ponyfill
94
+ }
86
95
let cancelled = false ;
87
- getResizeObserver ().then (observer => {
96
+
97
+ // if imported multiple times, should load from browser cache;
98
+ // or you can cache this in a variable
99
+ getResizeObserverOrPonyfill ().then (lib => {
88
100
if (! cancelled) {
89
- setResizeObserverApi (observer);
101
+ // must wrap `lib` in a function: `ResizeObserver` is a function
102
+ // itself, so prevent the state hook from interpreting as a reducer
103
+ setResizeObserver (() => lib);
90
104
}
91
105
});
106
+
92
107
return () => {
108
+ // if unmounted before complete, don't call set state
93
109
cancelled = true ;
94
110
}
95
111
}, []);
96
- useComponentSize (ref, { ResizeObserver: ResizeObserverApi });
112
+ useComponentSize (ref, { ResizeObserver });
97
113
```
0 commit comments