当前位置:首页 > VUE

vue如何实现防抖

2026-02-22 11:01:33VUE

防抖的实现原理

防抖(Debounce)是一种限制函数执行频率的技术,确保函数在连续触发时只执行一次。通常在输入框搜索、窗口resize等场景使用。核心原理是:延迟执行函数,若在延迟期间再次触发,则重新计时

Vue 2 的实现方法

方法1:使用 Lodash 的 _.debounce
安装 Lodash 并导入 debounce 方法:

npm install lodash

在 Vue 组件中使用:

import { debounce } from 'lodash';

export default {
  methods: {
    handleInput: debounce(function(value) {
      console.log('防抖处理:', value);
    }, 500)
  }
}

模板中绑定事件:

<input @input="handleInput($event.target.value)" />

方法2:手动实现防抖函数
自定义防抖工具函数:

function debounce(fn, delay) {
  let timer = null;
  return function(...args) {
    if (timer) clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, args);
    }, delay);
  };
}

在 Vue 组件中应用:

export default {
  methods: {
    handleInput: debounce(function(value) {
      console.log('手动防抖:', value);
    }, 500)
  }
}

Vue 3 的实现方法

方法1:Composition API + Lodash
通过 setup 使用防抖:

import { debounce } from 'lodash';

export default {
  setup() {
    const handleInput = debounce((value) => {
      console.log('防抖处理:', value);
    }, 500);

    return { handleInput };
  }
}

方法2:使用 ref 和自定义防抖
结合 Vue 3 的响应式特性:

import { ref } from 'vue';

export default {
  setup() {
    const inputValue = ref('');
    let timer = null;

    const debounceInput = (value) => {
      if (timer) clearTimeout(timer);
      timer = setTimeout(() => {
        console.log('防抖值:', value);
      }, 500);
    };

    return { inputValue, debounceInput };
  }
}

模板绑定:

<input v-model="inputValue" @input="debounceInput(inputValue)" />

注意事项

  • 延迟时间选择:根据场景调整延迟时间(如搜索建议常用 300-500ms)。
  • 内存泄漏:组件销毁时清除定时器(Vue 2 可在 beforeDestroy 中清理,Vue 3 使用 onUnmounted)。
  • 原生事件:若绑定原生 DOM 事件,需通过 $event 传递参数。

实际应用示例

搜索框防抖场景:

// Vue 3 Composition API 示例
import { ref } from 'vue';

export default {
  setup() {
    const searchQuery = ref('');
    const searchResults = ref([]);

    const fetchResults = debounce(async () => {
      const response = await api.search(searchQuery.value);
      searchResults.value = response.data;
    }, 500);

    return { searchQuery, searchResults, fetchResults };
  }
}

模板:

vue如何实现防抖

<input v-model="searchQuery" @input="fetchResults" />
<ul>
  <li v-for="item in searchResults" :key="item.id">{{ item.name }}</li>
</ul>

分享给朋友:

相关文章

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

h5如何实现蜡烛点亮

h5如何实现蜡烛点亮

实现蜡烛点亮的H5方法 在H5中实现蜡烛点亮效果,可以通过CSS动画、Canvas绘图或结合JavaScript交互来实现。以下是几种常见的方法: 使用CSS动画和JavaScript 通过…

vue如何实现图

vue如何实现图

Vue 实现图表的方法 Vue 中实现图表可以通过多种方式,常见的有使用第三方库或自定义实现。以下是几种常见的方法: 使用 ECharts ECharts 是一个功能强大的图表库,支持多种图表类型。…

vue如何实现ifream

vue如何实现ifream

Vue 中实现 iframe 的方法 在 Vue 中可以通过多种方式实现 iframe 的嵌入和控制。以下是几种常见的方法: 使用 HTML 原生 iframe 标签 在 Vue 模板中直接使用…

vue同步如何实现

vue同步如何实现

同步实现方法 在Vue中实现同步操作通常涉及处理异步任务(如API调用、定时器等)并使其以同步方式执行。以下是几种常见方法: 使用async/await 通过ES7的async/await语法可以简…

vue如何实现路由

vue如何实现路由

路由基础配置 在Vue中实现路由通常使用Vue Router库。安装Vue Router后,在项目中创建路由配置文件(如router/index.js),定义路由路径与组件的映射关系: import…