当前位置:首页 > VUE

vue实现视窗

2026-03-27 07:08:27VUE

Vue 实现视窗功能

在 Vue 中实现视窗功能通常涉及监听浏览器窗口大小变化、管理视窗状态或创建自定义视窗组件。以下是几种常见实现方式:

监听窗口大小变化

通过 window.addEventListener 监听 resize 事件,并在组件销毁时移除监听:

export default {
  data() {
    return {
      windowWidth: window.innerWidth,
      windowHeight: window.innerHeight
    }
  },
  mounted() {
    window.addEventListener('resize', this.handleResize)
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.handleResize)
  },
  methods: {
    handleResize() {
      this.windowWidth = window.innerWidth
      this.windowHeight = window.innerHeight
    }
  }
}

使用 Vue 响应式特性

结合 Vue.observable 创建全局响应式视窗对象:

// store/window.js
import Vue from 'vue'

export const windowStore = Vue.observable({
  width: window.innerWidth,
  height: window.innerHeight
})

window.addEventListener('resize', () => {
  windowStore.width = window.innerWidth
  windowStore.height = window.innerHeight
})

自定义视窗组件

创建可复用的视窗组件,提供插槽和响应式尺寸:

<template>
  <div class="viewport" :style="style">
    <slot :width="width" :height="height"></slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      width: window.innerWidth,
      height: window.innerHeight
    }
  },
  computed: {
    style() {
      return {
        width: `${this.width}px`,
        height: `${this.height}px`
      }
    }
  },
  mounted() {
    window.addEventListener('resize', this.updateDimensions)
  },
  destroyed() {
    window.removeEventListener('resize', this.updateDimensions)
  },
  methods: {
    updateDimensions() {
      this.width = window.innerWidth
      this.height = window.innerHeight
    }
  }
}
</script>

使用第三方库

考虑使用专门处理视窗的库如 vue-resizevue-window-size

// 使用 vue-window-size
import Vue from 'vue'
import VueWindowSize from 'vue-window-size'

Vue.use(VueWindowSize)

// 组件内直接使用
this.$windowWidth
this.$windowHeight

响应式设计辅助

结合 CSS 媒体查询和 Vue 数据实现响应式布局:

<template>
  <div :class="['container', screenSize]">
    <!-- 内容 -->
  </div>
</template>

<script>
export default {
  computed: {
    screenSize() {
      if (this.windowWidth < 768) return 'mobile'
      if (this.windowWidth < 1024) return 'tablet'
      return 'desktop'
    }
  }
}
</script>

视窗上下文提供

通过 provide/inject 跨组件共享视窗尺寸:

vue实现视窗

// 根组件
export default {
  provide() {
    return {
      windowSize: {
        width: this.windowWidth,
        height: this.windowHeight
      }
    }
  }
}

// 子组件
export default {
  inject: ['windowSize']
}

每种方法适用于不同场景,可根据项目需求选择简单监听、全局状态管理或完整组件解决方案。对于复杂应用,推荐使用 Vuex 配合窗口尺寸监听实现统一状态管理。

标签: 视窗vue
分享给朋友:

相关文章

vue实现直播

vue实现直播

Vue 实现直播的基本方法 在Vue中实现直播功能通常需要结合第三方直播服务或自建流媒体服务器。以下是几种常见的实现方式: 使用第三方直播SDK 腾讯云直播SDK 安装SDK包:npm…

vue实现下拉框删除

vue实现下拉框删除

Vue 实现下拉框删除功能 在Vue中实现下拉框的删除功能通常涉及以下步骤: 数据绑定与渲染 在Vue组件中定义数据数组用于存储下拉框选项: data() { return { op…

vue实现计时

vue实现计时

Vue 实现计时功能 在 Vue 中实现计时功能可以通过多种方式完成,以下是几种常见的方法: 使用 setInterval 实现基础计时器 通过 setInterval 和 clearInterva…

vue实现visual

vue实现visual

Vue 实现可视化(Visual)的常见方法 在 Vue 中实现可视化通常涉及数据可视化库的集成,以下是几种主流方案: 使用 ECharts ECharts 是一个强大的 JavaScript 图表…

vue原理实现

vue原理实现

Vue 原理实现的核心机制 Vue.js 的核心原理基于响应式系统、虚拟 DOM 和模板编译。以下是其核心实现机制的分解: 响应式系统 Vue 使用 Object.defineProperty(Vu…

vue实现selectable

vue实现selectable

Vue 实现可选择的 Select 组件 在 Vue 中实现一个可选择的 Select 组件,可以通过以下几种方式: 使用原生 HTML select 元素 <template>…