Vue3 中动态监听HTML元素大小变化的实践与探索
bigegpt 2024-10-17 08:05 5 浏览
引言
在Web开发中,尤其是在响应式布局设计时,我们常常需要根据HTML元素的尺寸变化来调整页面布局或内容展示。Vue3 提供了强大的响应式机制和Composition API,使得我们可以更灵活地监听并处理DOM元素尺寸的变化。本文将详细介绍如何在Vue3项目中实现这一功能。
一、传统方法:ResizeObserver
ResizeObserver 是浏览器提供的一个API,用于观察目标元素尺寸变化事件,并在其尺寸发生变化时触发回调函数。首先引入 ResizeObserver 并创建一个观察者实例:
import { onMounted, onUnmounted } from 'vue';
export default {
setup() {
const targetElement = ref(null); // 存储需要监听的DOM元素引用
let resizeObserver;
// 当组件挂载时创建ResizeObserver实例并开始监听
onMounted(() => {
resizeObserver = new ResizeObserver((entries) => {
entries.forEach((entry) => {
console.log('Element size changed:', entry.contentRect.width, entry.contentRect.height);
// 在这里执行相应的逻辑处理
});
});
if (targetElement.value) {
resizeObserver.observe(targetElement.value);
}
});
// 组件卸载时停止监听
onUnmounted(() => {
if (resizeObserver && targetElement.value) {
resizeObserver.unobserve(targetElement.value);
}
});
return {
targetElement,
};
},
};
在模板中,绑定目标元素到 targetElement ref:
<div ref="targetElement">需要监听大小变化的元素</div>
二、结合Vue3的响应式优势
为了更好地与Vue3的数据响应性相结合,我们可以利用Ref或者Computed属性来存储和更新元素尺寸信息:
import { ref, computed, onMounted, onUnmounted } from 'vue';
export default {
setup() {
const targetElement = ref(null);
const elementSize = ref({ width: 0, height: 0 });
let resizeObserver;
onMounted(() => {
resizeObserver = new ResizeObserver((entries) => {
const entry = entries[0];
elementSize.value = {
width: entry.contentRect.width,
height: entry.contentRect.height,
};
});
if (targetElement.value) {
resizeObserver.observe(targetElement.value);
}
});
onUnmounted(() => {
if (resizeObserver && targetElement.value) {
resizeObserver.unobserve(targetElement.value);
}
});
// 创建一个计算属性以返回最新尺寸信息
const reactiveElementSize = computed(() => elementSize.value);
return {
targetElement,
reactiveElementSize,
};
},
};
现在你可以在其他组件内部使用 reactiveElementSize 计算属性来获取实时的元素尺寸数据,并据此做出相应布局调整。
在上述代码示例中,elementSize 用于存储元素的尺寸信息(宽度和高度),我们使用了 ref 来定义它。然而,如果你希望 elementSize 对象本身具有响应性,即当对象内部的属性发生变化时也能触发视图更新,那么使用 reactive 可能会更合适。
import { ref, reactive, onMounted, onUnmounted } from 'vue';
export default {
setup() {
const targetElement = ref(null);
// 使用reactive创建响应式对象
const elementSize = reactive({ width: 0, height: 0 });
let resizeObserver;
onMounted(() => {
resizeObserver = new ResizeObserver((entries) => {
const entry = entries[0];
// 直接修改响应式对象内部属性
elementSize.width = entry.contentRect.width;
elementSize.height = entry.contentRect.height;
});
if (targetElement.value) {
resizeObserver.observe(targetElement.value);
}
});
onUnmounted(() => {
if (resizeObserver && targetElement.value) {
resizeObserver.unobserve(targetElement.value);
}
});
return {
targetElement,
elementSize,
};
},
};
在这种情况下,因为 elementSize 是一个由 reactive 创建的响应式对象,所以在其内部属性 width 和 height 发生变化时,依赖这些值的组件也会自动重新渲染,无需额外的操作。
需要注意的是,在实际应用中,如果只是简单的尺寸数值,使用 ref 足以满足需求,因为 ref 的 .value 属性本身就是响应式的。而 reactive 更适用于需要整个对象结构都具有响应性的场景。
三、总结
Vue3 的 Composition API 结合浏览器原生的 ResizeObserver 可以为我们在监听HTML元素尺寸变化上提供强大而灵活的支持。通过这样的方式,开发者可以轻松应对各种复杂的响应式布局需求,为用户带来更好的交互体验。同时,借助Vue3的数据响应性和自动更新机制,能够在元素尺寸变化时及时刷新视图,保持UI状态与实际DOM的一致性。
相关推荐
- LangChain4j如何自定义文档转换器实现数据清洗?
-
LangChain4j提供了3种RAG(Retrieval-AugmentedGeneration,检索增强生成)实现,我们通常在原生或高级的RAG实现中,要对数据进行清洗,也就是将外接...
- Java 8 Stream API 详解(java stream.)
-
Java8StreamAPI详解一、概述在Java8中,StreamAPI是一个重要的新特性。它为处理集合(如List、Set等)中的元素提供了一种高效且富有表现力的方式。Str...
- Java修炼终极指南:185 使用 Stream 过滤嵌套集合
-
这是面试中的一个经典问题,通常从一个模型开始,如下所示(我们假设集合是一个List):publicclassAuthor{privatefinalStringname;pri...
- java8的stream使用小示例(java stream())
-
据JetBrains发布的2021年开发者生态系统调查,Java8在java使用的版本中仍然是当前最流行的版本。72%的专业开发人员使用Java8作为其在java开发中主要编程语言版本。现...
- Node.js Stream - 实战篇(node.js in action)
-
本文转自“美团点评技术团队”http://tech.meituan.com/stream-in-action.html背景前面两篇(基础篇和进阶篇)主要介绍流的基本用法和原理,本篇从应用的角度,介...
- Java Stream:集合处理的api(java 集合操作)
-
JavaStream流:高效集合处理的函数式编程利器一、什么是JavaStream?Java8引入的StreamAPI是一套用于处理集合数据的流式编程接口,通过函数式风格(无副作用的...
- 去除 List 中的重复元素,你知道几种实现方法?
-
去除List中重复元素,这在实际编程或面试中经常遇到,每个人都有习惯的写法吧,这里抛砖引玉,汇总了一些实现方案,开拓思路。准备数据假设数组中有10个数据,可能有重复,需要将重复的数据从数组中去掉。pu...
- Java开发者必看!Stream流式编程10个爆款技巧,让你代码优雅飞起
-
为什么你的Java代码总像拧巴的麻绳?掌握这10个Stream实战技巧,代码效率与优雅度将产生质的飞跃。以下案例均来自真实电商系统场景,带你感受流式编程的降维打击!一、过滤与映射组合拳(Filter...
- leetcode每日一题之存在重复元素(存在重复元素 iii)
-
题:给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回true。如果数组中每个元素都不相同,则返回false。比如:输入:[1,2,3,1]输出:true...
- 告别for循环!揭秘Stream API如何让你的代码简洁度提升300%
-
一、当传统循环遇上现代需求真实场景复现:某电商平台需要处理10万条订单数据,要求:筛选出金额>500的订单提取用户ID并去重统计VIP用户数量传统实现方案://常规写法Set<Long...
- Java中List去重的N种方法:从基础到优雅
-
Java中List去重的N种方法:从基础到优雅在日常的Java开发中,我们经常会遇到需要对List集合去重的情况。无论是为了清理重复的数据,还是为了优化算法性能,掌握多种去重方式都是一项非常实用的技能...
- Java Stream流没用过?常用高频方法
-
概念Stream流是Java8添加的以一种链式调用的方法处理数据,主要侧重于计算。具有以下相关特点代码简洁链式调用Stream常用方法1.将数组变为当作List操作String[]strArr=...
- 核医学专业名词索引(M-R)(核医学重点归纳)
-
M吗啡(morphia)埋藏式心律转复除颤器(implantablecardioverterdefibrillator,ICD)麦角骨化醇(VD2,calciferol)脉冲堆积(pulsepi...
- CodeMeter 新版发布(codesigner下载)
-
威步于2022年8月4日发布CodeMeter7.50及CodeMeter软件保护套装11.10,以下为新版内容。CodeMeterRuntime7.50StreamingSIMDExten...
- 世界上最小的五轴铣床Pocket NC(最小的五轴加工中心)
-
PocketNC,由MIT学生研制,还有说法是这款产品的设计者是来自美国蒙大拿州的一对极客夫妻。目前主要有两款产品:PocketNCV2-50,9000美元;PocketNCV2-10,60...
- 一周热门
- 最近发表
-
- LangChain4j如何自定义文档转换器实现数据清洗?
- Java 8 Stream API 详解(java stream.)
- Java修炼终极指南:185 使用 Stream 过滤嵌套集合
- java8的stream使用小示例(java stream())
- Node.js Stream - 实战篇(node.js in action)
- Java Stream:集合处理的api(java 集合操作)
- 去除 List 中的重复元素,你知道几种实现方法?
- Java开发者必看!Stream流式编程10个爆款技巧,让你代码优雅飞起
- leetcode每日一题之存在重复元素(存在重复元素 iii)
- 告别for循环!揭秘Stream API如何让你的代码简洁度提升300%
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)