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

VueJS中如何结合preventDefault与Timeout实现点击间隔限制?

实现router-link点击后1500ms内禁止重复点击(结合preventDefault)

需求:让router-link点击后1500ms内无法再次触发跳转,仅允许每1500ms点击一次,不使用CSS的pointer-events,通过代码结合preventDefault解决。

原尝试代码:

<router-link :to="item.path" @click="blockedLinkOnClick(e)">{{ item.name }}</router-link>

原处理方法:

blockedLinkOnClick(e) {
  setTimeout(() => e.preventDefault(), 1500);
}

问题分析

上述写法无效的核心原因:点击事件的默认行为(路由跳转)会在事件处理函数同步执行完成后立即触发,延迟调用e.preventDefault()根本无法阻止本次跳转,更无法限制后续点击操作。

正确实现方式

通过维护一个状态变量标记当前是否允许点击,点击时先判断状态:

  • 若不允许点击,直接调用e.preventDefault()阻止跳转
  • 若允许点击,先标记为禁止状态,再通过setTimeout在1500ms后恢复允许状态

Vue2选项式API完整代码:

<template>
  <router-link :to="item.path" @click="handleLinkClick($event)">{{ item.name }}</router-link>
</template>

<script>
export default {
  data() {
    return {
      isLinkClickAllowed: true // 标记是否允许点击
    };
  },
  methods: {
    handleLinkClick(e) {
      if (!this.isLinkClickAllowed) {
        // 当前不允许点击,阻止默认跳转行为
        e.preventDefault();
        return;
      }
      // 标记为禁止点击
      this.isLinkClickAllowed = false;
      // 1500ms后恢复允许点击
      setTimeout(() => {
        this.isLinkClickAllowed = true;
      }, 1500);
    }
  }
};
</script>

Vue3组合式API完整代码:

<template>
  <router-link :to="item.path" @click="handleLinkClick($event)">{{ item.name }}</router-link>
</template>

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

const isLinkClickAllowed = ref(true);

const handleLinkClick = (e) => {
  if (!isLinkClickAllowed.value) {
    e.preventDefault();
    return;
  }
  isLinkClickAllowed.value = false;
  setTimeout(() => {
    isLinkClickAllowed.value = true;
  }, 1500);
};
</script>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:25:34