vue3 监听容器大小变化

本文介绍了如何在Vue项目中使用ResizeObserver监测`element`组件的宽高变化,以实现当宽度小于1140px时切换isSmall状态。文章详细阐述了组件挂载、卸载时的观察者管理和生命周期管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<template>
  <div ref="element">
  	...
  </div>
</template>
<script setup>
	import {ref, onMounted, onBeforeUnmount} from "vue";
	
	const isSmall = ref(false)
	const element = ref(null);
	
	const resizeObserver = new ResizeObserver(entries => {
	  // 处理大小变化的回调函数
	  if(element.value && element.value.offsetWidth < 1140) {
	    isSmall.value = true
	  } else {
	    isSmall.value = false
	  }
	});
	
	onMounted(() => {
	  getList()
	  resizeObserver.observe(element.value);
	})
	
	// 移除监听 
	onBeforeUnmount(() => {
	  resizeObserver.unobserve(element.value);
	})
</script>
### 使用 `ResizeObserver` 和窗口事件监听器实现页面宽度变化Vue 3 中,可以采用多种方式来监听页面宽度的变化并据此调整组件的行为或样式。以下是两种常用的方法: #### 方法一:使用原生 JavaScript 的 `window.addEventListener` 通过监听浏览器窗口大小变化,在每次窗口尺寸发生变化时触发回调函数,从而更新组件的状态。 ```javascript <template> <div class="container"> <!-- 组件模板 --> </div> </template> <script setup> import { ref, onMounted, onUnmounted } from &#39;vue&#39;; const windowWidth = ref(window.innerWidth); function handleResize() { windowWidth.value = window.innerWidth; } onMounted(() => { window.addEventListener(&#39;resize&#39;, handleResize); }); onUnmounted(() => { window.removeEventListener(&#39;resize&#39;, handleResize); }); </script> <style scoped> /* 样式 */ .container { /* 动态设置最大宽度或其他样式 */ } </style> ``` 这种方法简单易懂,适合大多数场景下监控整个页面的宽度变化[^2]。 #### 方法二:使用 `ResizeObserver` API 来监测特定 DOM 元素的尺寸变动 对于需要精确跟踪某个具体容器(如 `.content-box`)宽高的情况,则推荐使用 `ResizeObserver` 接口。此接口允许开发者观察目标元素的内容矩形何时发生了更改,并相应地作出反应。 ```html <div id="app"> <div :class="{ narrow: isNarrow }" ref="targetElement"></div> </div> ``` ```javascript export default { data() { return { observer: null, isNarrow: false, }; }, mounted() { const resizeObserver = new ResizeObserver((entries) => { entries.forEach(entry => { if (entry.contentRect.width < 768) { this.isNarrow = true; } else { this.isNarrow = false; } }); }); resizeObserver.observe(this.$refs.targetElement); // 存储observer以便稍后移除 this.observer = resizeObserver; }, unmounted() { // 清理资源 if (this.observer && this.$refs.targetElement) { this.observer.unobserve(this.$refs.targetElement); } } }; ``` 上述代码展示了如何创建一个 `ResizeObserver` 实例去监视指定元素(`ref="targetElement"`), 并基于其实际宽度决定是否应用额外类名`.narrow`,进而影响视觉效果[^4]. 这两种方案都能很好地满足不同层次的需求——前者适用于全局性的布局调整;后者则更适合局部区域内的精细控制。选择哪种取决于项目的具体情况和个人偏好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值