当前位置:首页 > VUE

vue实现防抖节流

2026-02-09 16:11:25VUE

防抖(Debounce)实现

防抖的核心在于延迟执行,直到事件停止触发后一段时间才执行。适用于输入框搜索、窗口调整等场景。

在Vue中可以通过自定义指令或方法实现:

方法1:使用Lodash库的_.debounce

import _ from 'lodash';

export default {
  methods: {
    handleInput: _.debounce(function() {
      // 实际业务逻辑
      console.log('Debounced input');
    }, 500)
  }
}

方法2:原生JavaScript实现

vue实现防抖节流

export default {
  data() {
    return {
      timeout: null
    }
  },
  methods: {
    handleInput() {
      clearTimeout(this.timeout);
      this.timeout = setTimeout(() => {
        // 实际业务逻辑
        console.log('Debounced input');
      }, 500);
    }
  }
}

节流(Throttle)实现

节流的核心在于固定时间间隔内只执行一次。适用于滚动事件、高频点击等场景。

方法1:使用Lodash库的_.throttle

vue实现防抖节流

import _ from 'lodash';

export default {
  methods: {
    handleScroll: _.throttle(function() {
      // 实际业务逻辑
      console.log('Throttled scroll');
    }, 1000)
  }
}

方法2:原生JavaScript实现

export default {
  data() {
    return {
      lastExecTime: 0
    }
  },
  methods: {
    handleClick() {
      const now = Date.now();
      if (now - this.lastExecTime >= 1000) {
        // 实际业务逻辑
        console.log('Throttled click');
        this.lastExecTime = now;
      }
    }
  }
}

自定义指令实现

创建可复用的防抖/节流指令:

// debounce.js
export default {
  inserted(el, binding) {
    let timer;
    el.addEventListener('input', () => {
      clearTimeout(timer);
      timer = setTimeout(() => {
        binding.value();
      }, binding.arg || 500);
    });
  }
}

// throttle.js
export default {
  inserted(el, binding) {
    let lastExec = 0;
    el.addEventListener('click', () => {
      const now = Date.now();
      if (now - lastExec >= (binding.arg || 1000)) {
        binding.value();
        lastExec = now;
      }
    });
  }
}

// main.js
import debounce from './debounce';
import throttle from './throttle';

Vue.directive('debounce', debounce);
Vue.directive('throttle', throttle);

使用方式:

<input v-debounce:300="search" />
<button v-throttle:1000="submit">提交</button>

注意事项

  • 在组件销毁时应当清除定时器,避免内存泄漏
  • 时间间隔需要根据实际场景调整
  • 对于复杂场景建议使用成熟的工具库如Lodash
  • 在Vue3中可以使用setup语法结合ref实现相同功能

标签: 防抖vue
分享给朋友:

相关文章

vue实现生成二维码

vue实现生成二维码

使用qrcode.vue库生成二维码 安装qrcode.vue库: npm install qrcode.vue --save 在Vue组件中使用: <template> &l…

vue课程实现

vue课程实现

Vue 课程实现方案 课程内容设计 Vue课程应从基础到高级逐步展开,涵盖Vue核心概念、组件化开发、状态管理、路由、构建工具等。基础部分包括Vue实例、模板语法、计算属性和侦听器。中级部分深入组件通…

vue实现前端

vue实现前端

Vue 实现前端的核心方法与步骤 安装 Vue 项目 使用 Vue CLI 或 Vite 创建项目。Vue CLI 是传统构建工具,Vite 是新一代轻量级工具。 npm init vue@l…

vue实现动画

vue实现动画

Vue 实现动画的方法 Vue 提供了多种方式来实现动画效果,包括内置的过渡系统、第三方动画库以及直接操作 CSS 或 JavaScript 动画。 使用 Vue 内置过渡系统 Vue 的 <…

vue实现mouseout

vue实现mouseout

Vue 实现 mouseout 事件的方法 在 Vue 中实现 mouseout 事件可以通过多种方式完成,以下是几种常见的方法: 使用 v-on 指令 Vue 提供了 v-on 指令(或简写为 @…

vue实现selectable

vue实现selectable

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