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

模板:

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

vue如何实现防抖

分享给朋友:

相关文章

vue如何实现拖动

vue如何实现拖动

Vue 实现拖动的几种方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,通过 draggable 属性和相关事件实现拖动功能。 <template> &…

vue如何实现目录组件

vue如何实现目录组件

实现目录组件的基本思路 在Vue中实现目录组件通常需要结合页面内容的结构化数据(如标题层级),通过动态渲染生成可交互的目录。核心步骤包括提取标题、生成目录结构、实现滚动联动等。 提取标题信息 通过…

php如何实现静态化

php如何实现静态化

PHP 实现静态化的方法 使用 ob_start() 和 ob_get_contents() 利用 PHP 的输出缓冲功能捕获动态生成的页面内容,将其保存为静态文件。这种方法适用于内容不频繁变化的页面…

vue如何实现重新实现主题

vue如何实现重新实现主题

Vue 主题切换的实现方法 使用 CSS 变量动态切换主题 定义主题相关的 CSS 变量,通过修改这些变量实现主题切换。在根元素(如 :root)中定义默认主题的变量,在特定类名下定义其他主题的变量。…

vue如何实现分离

vue如何实现分离

Vue 实现代码分离的方法 Vue 提供了多种方式实现代码分离,提升项目的可维护性和模块化程度。以下是常见的几种方法: 组件化开发 将功能拆分为独立的 Vue 组件,每个组件包含自己的模板、逻辑和样…

前段vue如何实现

前段vue如何实现

Vue 前端实现方法 Vue 是一款流行的前端框架,用于构建用户界面。以下是一些常见的 Vue 实现方法: 组件化开发 Vue 的核心思想是组件化开发。每个组件可以独立封装逻辑、模板和样式,便于复…