Vue 实时监听窗口变化 windowresize的两种方法

本文介绍了在Vue中实时监听窗口大小变化的两种方法:一种是通过定义变量、在mounted生命周期钩子中绑定并使用watch监听;另一种是在Vue 2.x中直接在mounted中挂载window.onresize事件进行全局监听。

方法一:

1.定义变量

1

2

3

4

5

data(){

  return{

     formWidth : '123px'

  }

},

2.根据生命周期 在mounted 中绑定 窗口变化

1

2

3

4

5

6

7

8

9

mounted(){

      const that = this

      window.onresize = () => {

        return (() => {

         window.screenWidth = document.body.clientWidth

         that.screenWidth = window.screenWidth

        })()

      }

},

3:   绑定监听 watch

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

watch: {

       screenWidth (val) {

            if (!this.timer) {

              this.screenWidth = val

              this.timer = true

              let that = this

              setTimeout(function () {

                // that.screenWidth = that.$store.state.canvasWidth

                console.log(that.screenWidth)

                // that.init()

                that.timer = false

              }, 400)

            }

       }

 },

方法二:在vue.2x里面时候,mounted 里面可以直接挂载 window.onresize事件。全局监听

1

2

3

4

5

6

7

8

mounted(){

       window.onresize = () => {

         return (() => {

           this.handleWidth();

         })()

       }

       this.handleWidth();

},

完全可以做到检测窗口变化

### 使用 `ResizeObserver` 和窗口事件监听器实现页面宽度变化Vue 3 中,可以采用多种方式来监听页面宽度的变化并据此调整组件的行为或样式。以下是两种常用的方法: #### 方法一:使用原生 JavaScript 的 `window.addEventListener` 通过监听浏览器窗口大小的变化,在每次窗口尺寸发生变化时触发回调函数,从而更新组件的状态。 ```javascript <template> <div class="container"> <!-- 组件模板 --> </div> </template> <script setup> import { ref, onMounted, onUnmounted } from 'vue'; const windowWidth = ref(window.innerWidth); function handleResize() { windowWidth.value = window.innerWidth; } onMounted(() => { window.addEventListener('resize', handleResize); }); onUnmounted(() => { window.removeEventListener('resize', 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]. 这两种方案都能很好地满足不同层次的需求——前者适用于全局性的布局调整;后者则更适合局部区域内的精细控制。选择哪种取决于项目的具体情况和个人偏好。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值