Follow

A Vue3 HTMLElement Resize observer hook:

import { ref, watch, Ref } from 'vue'
import ResizeObserver from 'resize-observer-polyfill'

export interface UseResizeObserver {
  width: number
  height: number
  top: number
  left: number
  element?: Element
}

export default function (elementRef: Ref<Element | null>) {
  const state: Ref<UseResizeObserver> = ref({
    width: NaN,
    height: NaN,
    top: NaN,
    left: NaN,
    element: undefined,
  })

  const ro = new ResizeObserver((entries, observer) => {
    for (const entry of entries) {
      const { left, top, width, height } = entry.contentRect

      state.value = { width, height, top, left, element: entry.target }
    }
  })

  watch(elementRef, (element) => {
    if (element) ro.observe(element)
  })

  return state
}

TODO: add method of watch all inputs in one observer, maybe should use a constructor

· · Web · 0 · 0 · 0
Sign in to participate in the conversation
小森林

每个人都有属于自己的一片森林,也许我们从来不曾走过,但它一直在那里,总会在那里。迷失的人迷失了,相逢的人会再相逢。愿这里,成为属于你的小森林。