当前位置:首页 > 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>

分享给朋友:

相关文章

vue底层如何实现

vue底层如何实现

Vue 底层的核心实现机制 Vue 的底层实现主要围绕响应式系统、虚拟 DOM 和组件化架构展开。以下是关键技术的详细解析: 响应式系统 依赖追踪与发布订阅模式 通过 Object.definePr…

vue如何实现递归

vue如何实现递归

递归组件的实现方法 在Vue中实现递归组件通常用于渲染树形结构或嵌套数据。核心思路是组件在其模板中调用自身,但需注意终止条件以避免无限循环。 定义递归组件 组件需设置name选项,才能在模板中调用自…

vue如何实现截图

vue如何实现截图

Vue 实现截图的方法 在 Vue 中实现截图功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 html2canvas 库 html2canvas 是一个流行的 JavaScript 库,…

vue如何实现录音

vue如何实现录音

使用Web Audio API实现录音 在Vue中实现录音功能可以通过Web Audio API结合MediaRecorder API来完成。以下是一个基础实现方案: 安装必要的依赖: npm i…

vue 如何实现返回

vue 如何实现返回

Vue 实现返回功能的方法 使用 router.go(-1) 在 Vue 中可以通过 Vue Router 的 go 方法实现返回上一页的功能。在需要触发返回的按钮或方法中调用 this.$route…

vue权限如何实现

vue权限如何实现

Vue 权限实现方案 在 Vue 项目中实现权限控制通常涉及路由权限、按钮权限和接口权限三个方面。以下是具体实现方法: 路由权限控制 路由权限通常通过动态路由和全局路由守卫实现。用户登录后获取权限列…