当前位置:首页 > 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的响应式数据和事件绑定特性来完成。主要思路是利用v-show或v-if控制下拉菜单的显示与隐藏,并通过鼠标事件或点击事件触发状态变化。…

vue实现公告

vue实现公告

Vue 实现公告功能的方法 公告功能通常需要实现滚动展示、自动切换或固定显示的效果。以下是几种常见的实现方式: 使用 marquee 标签实现滚动公告 <template> &l…

vue拖拽实现

vue拖拽实现

Vue 拖拽实现方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop 事…

vue实现Siri

vue实现Siri

Vue 实现 Siri 风格语音交互 实现类似 Siri 的语音交互功能需要结合语音识别、语音合成和前端交互逻辑。Vue 作为前端框架,可以很好地管理这些功能的交互状态。 语音识别集成 使用 Web…

vue watch实现

vue watch实现

在 Vue 中实现 watch 监听数据变化 Vue 的 watch 选项用于监听数据变化并执行相应的回调函数。以下是几种常见的实现方式: 基础用法 export default { data(…

vue实现layout

vue实现layout

Vue 实现 Layout 布局的方法 在 Vue 中实现 Layout 布局通常涉及路由嵌套、组件化设计和动态渲染。以下是几种常见的实现方式: 使用嵌套路由 通过 Vue Router 的嵌套路由…