On gists
useElementSize - own composable
Vue.js
useElementSize.js
Raw
#
import { ref, watch } from 'vue';
function useElementSize(element) {
const width = ref(0);
const height = ref(0);
let observer = null;
function disconnect() {
if (observer !== null) {
observer.disconnect();
observer = null;
}
}
function connect(element) {
disconnect();
observer = new ResizeObserver((entries) => {
const rect = entries[0]?.contentRect;
if (rect) {
width.value = rect.width;
height.value = rect.height;
}
});
observer.observe(element);
}
watch(
element,
(el) => {
if (el) connect(el);
else disconnect();
}
)
return {
width,
height,
};
}