use-resize-observer.ts 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import { useLayoutEffect, useRef, useCallback, RefObject } from 'react'
  2. function useResizeObserver(
  3. observedElement: RefObject<HTMLElement>,
  4. observedData: any,
  5. callback: (observedElement: ResizeObserverEntry) => void
  6. ) {
  7. const resizeObserver = useRef<ResizeObserver>()
  8. const observe = useCallback(() => {
  9. resizeObserver.current = new ResizeObserver(function (elementsObserved) {
  10. callback(elementsObserved[0])
  11. })
  12. }, [callback])
  13. function unobserve(observedCurrent: HTMLElement) {
  14. if (resizeObserver.current) {
  15. resizeObserver.current.unobserve(observedCurrent)
  16. }
  17. }
  18. useLayoutEffect(() => {
  19. if ('ResizeObserver' in window) {
  20. const observedCurrent = observedElement && observedElement.current
  21. if (observedCurrent) {
  22. observe()
  23. }
  24. if (resizeObserver.current && observedCurrent) {
  25. resizeObserver.current.observe(observedCurrent)
  26. }
  27. return () => {
  28. if (observedCurrent) {
  29. unobserve(observedCurrent)
  30. }
  31. }
  32. }
  33. }, [observedElement, observedData, observe])
  34. }
  35. export default useResizeObserver