当前位置:首页 > 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实现骰子

Vue 实现骰子功能 创建 Vue 组件 在 Vue 项目中创建一个骰子组件,例如 Dice.vue。该组件包含骰子的外观和逻辑。 <template> <div class=…

vue实现模块

vue实现模块

Vue 实现模块化的方法 Vue 支持多种模块化开发方式,可以根据项目需求选择适合的方案。 使用单文件组件(SFC) 单文件组件是 Vue 最常用的模块化方式,将模板、脚本和样式封装在一个 .vue…

vue 实现打印

vue 实现打印

Vue 实现打印功能的方法 在Vue项目中实现打印功能,可以通过以下几种方式实现: 使用window.print()方法 通过调用浏览器的原生打印API实现基础打印功能,适用于简单内容打印。 //…

vue 实现excel

vue 实现excel

Vue 实现 Excel 功能 前端导出 Excel 使用 xlsx 库可以轻松实现前端 Excel 导出功能。安装依赖: npm install xlsx 导出 Excel 示例代码: impo…

vue实现选人

vue实现选人

实现选人功能的基本思路 在Vue中实现选人功能通常涉及以下核心环节:数据绑定、用户交互处理、状态管理以及界面渲染。以下是具体实现方法: 数据准备与组件结构 创建包含人员信息的数组,通常从API获取或…

vue 实现图钉

vue 实现图钉

实现图钉效果的步骤 在Vue中实现图钉(固定位置)效果,可以通过CSS的position: sticky属性或监听滚动事件动态修改元素样式。以下是两种常见方法: 方法一:使用CSS的position…