You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据屏幕尺寸条件性添加事件监听器?

好问题!在Vue里实现这种根据屏幕尺寸动态控制点击事件的需求,有几种简洁且实用的方案,我给你梳理一下:

方案一:点击时直接判断屏幕宽度(简单直接)

这种方式不需要额外监听窗口变化,每次点击时实时判断当前屏幕尺寸,再决定是否执行逻辑和阻止默认行为:

<a href="#" @click="handleNavClick"> Link </a>

<script>
export default {
  data() {
    return {
      active: false
    }
  },
  methods: {
    handleNavClick(e) {
      // 这里以768px作为移动端/桌面端的分界,你可以根据需求调整
      if (window.innerWidth < 768) {
        e.preventDefault(); // 移动端阻止锚点默认行为
        this.active = !this.active; // 切换状态
      }
      // 桌面端啥也不做,直接依赖hover交互即可
    }
  }
}
</script>

方案二:响应式绑定点击事件(适配窗口 resize)

如果需要窗口大小变化时实时切换交互逻辑,可以先维护一个isMobile的响应式状态,再通过动态指令绑定来控制点击事件:

<template>
  <a 
    href="#" 
    <!-- 动态绑定事件:移动端绑定带prevent的点击逻辑,桌面端绑定空对象(无事件) -->
    v-on="isMobile ? { 'click.prevent': () => active = !active } : {}"
  > 
    Link 
  </a>
</template>

<script>
export default {
  data() {
    return {
      active: false,
      isMobile: window.innerWidth < 768 // 初始化时判断一次
    }
  },
  mounted() {
    // 监听窗口resize事件,实时更新移动端状态
    window.addEventListener('resize', this.updateScreenSize);
  },
  beforeUnmount() {
    // 组件销毁前移除监听,避免内存泄漏
    window.removeEventListener('resize', this.updateScreenSize);
  },
  methods: {
    updateScreenSize() {
      this.isMobile = window.innerWidth < 768;
    }
  }
}
</script>

方案三:Vue 3 Composition API 写法

如果你的项目用的是Vue 3,可以用更简洁的组合式API实现:

<template>
  <a 
    href="#" 
    v-on="isMobile ? { 'click.prevent': toggleActive } : {}"
  > 
    Link 
  </a>
</template>

<script setup>
import { ref, onMounted, onUnmounted } from 'vue';

const active = ref(false);
const isMobile = ref(window.innerWidth < 768);

const toggleActive = () => {
  active.value = !active.value;
};

const updateScreenSize = () => {
  isMobile.value = window.innerWidth < 768;
};

onMounted(() => {
  window.addEventListener('resize', updateScreenSize);
});

onUnmounted(() => {
  window.removeEventListener('resize', updateScreenSize);
});
</script>

优化小技巧:防抖处理 resize 事件

窗口resize事件会频繁触发,给updateScreenSize加个防抖可以避免不必要的性能消耗:

// 简单的防抖函数
const debounce = (func, delay = 200) => {
  let timeoutId;
  return (...args) => {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => func.apply(this, args), delay);
  };
};

// 在Vue 2中使用防抖
mounted() {
  const debouncedUpdate = debounce(this.updateScreenSize);
  window.addEventListener('resize', debouncedUpdate);
  this.debouncedUpdate = debouncedUpdate; // 存下来用于销毁时移除监听
},
beforeUnmount() {
  window.removeEventListener('resize', this.debouncedUpdate);
}

内容的提问来源于stack exchange,提问作者panthro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:57:35