use-resize-observer.js 841 B

123456789101112131415161718192021222324252627282930313233343536
  1. import { useCallback, useEffect, useRef } from 'react'
  2. export const useResizeObserver = handleResize => {
  3. const resizeRef = useRef(null)
  4. const elementRef = useCallback(
  5. element => {
  6. if (element && 'ResizeObserver' in window) {
  7. if (resizeRef.current) {
  8. resizeRef.current.observer.unobserve(resizeRef.current.element)
  9. }
  10. const observer = new ResizeObserver(([entry]) => {
  11. handleResize(entry.target)
  12. })
  13. resizeRef.current = { element, observer }
  14. observer.observe(element)
  15. handleResize(element) // trigger the callback once
  16. }
  17. },
  18. [handleResize]
  19. )
  20. useEffect(() => {
  21. return () => {
  22. if (resizeRef.current) {
  23. resizeRef.current.observer.unobserve(resizeRef.current.element)
  24. }
  25. }
  26. }, [])
  27. return elementRef
  28. }