vue3+ts:监听dom宽高变化函数
vue
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
项目地址:https://gitcode.com/gh_mirrors/vu/vue
免费下载资源
·
一、效果展示
二、代码
getSize.ts
import { ref, Ref, watchEffect } from "vue";
export const getWidth = (domRef: Ref<HTMLElement | null>) => {
const width = ref<number>(0);
const height = ref<number>(0);
const observer = new ResizeObserver(() => {
if (domRef.value) {
width.value = domRef.value.clientWidth;
height.value = domRef.value.clientHeight;
}
console.log("width", width.value);
});
//设置一个变量来存储dom元素,让ResizeObserver知道它要监听哪个元素
//因为domRef.value可能会变化,所以我们需要一个变量来存储它,这样我们就可以在domRef.value变化的时候取消监听,防止内存泄漏并提高性能
//如果在该函数中需要同时监听多个dom,可以考虑使用weakMap来存储dom和ResizeObserver实例
let observerDom: HTMLElement | null = null;
watchEffect(() => {
const newDom = domRef.value;
//如果我们传入的dom存在,就让ResizeObserver监听它
//如果我们传入的dom不存在,就让ResizeObserver取消监听
if (newDom) {
observerDom = newDom;
observer.observe(observerDom);
} else if (observerDom) {
observer.unobserve(observerDom);
}
});
return { width, height };
};
组件中使用:
<template>
<div class="page">
<div class="observerDom" ref="observerRef">{{ width.width }}</div>
</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
import { getWidth } from "./getSize";
const observerRef = ref();
const width = getWidth(observerRef);
</script>
<style scoped>
.page {
width: 100%;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background-color: #8c4141;
}
.observerDom {
width: 60%;
height: 60px;
background-color: #f1f1f1;
}
</style>
GitHub 加速计划 / vu / vue
207.54 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
73486cb5
* chore: fix link broken
Signed-off-by: snoppy <michaleli@foxmail.com>
* Update packages/template-compiler/README.md [skip ci]
---------
Signed-off-by: snoppy <michaleli@foxmail.com>
Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 4 个月前
e428d891
Updated Browser Compatibility reference. The previous currently returns HTTP 404. 5 个月前
更多推荐
已为社区贡献10条内容
所有评论(0)