VUE前端实现防抖节流Lodash工具库举例详解

 更新时间:2025年01月23日 09:08:56   作者:百事老饼干  
这篇文章主要介绍了Lodash库和自定义防抖、节流函数的使用方法,包括它们的定义、应用示例及应用场景文中通过代码介绍的非常详细,需要的朋友可以参考下

方法一:采用Lodash工具库

Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。

(1)采用终端导入Lodash库

$ npm i -g npm
$ npm i --save lodash

(2)应用

示例:搜索框输入防抖

在这个示例中,我们希望用户在输入框中停止输入 500 毫秒后才执行搜索操作,避免频繁请求.

<input type="text" id="search" placeholder="Search...">

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
<script>
  // 假设这是一个执行搜索操作的函数
  function performSearch(query) {
    console.log('Searching for:', query);
    // 这里可以发送 ajax 请求进行搜索
  }

  // 使用 lodash 的 debounce 函数
  const debouncedSearch = _.debounce(function(event) {
    performSearch(event.target.value);
  }, 500);  // 500ms 的防抖时间

  // 监听输入框的输入事件
  document.getElementById('search').addEventListener('input', debouncedSearch);
</script>

示例:滚动事件节流

在这个示例中,我们希望当用户滚动页面时,每隔 1 秒才记录一次滚动事件,避免频繁触发回调函数。

<div style="height: 2000px;">Scroll down to see the effect</div>
<!-- 导入 throttle 函数-->
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
<script>
    // 这是一个处理滚动事件的函数
    function handleScroll() {
        console.log('Scroll event detected at:', new Date().toLocaleTimeString());
    }

    // 使用 lodash 的 throttle 函数,每隔 1 秒最多触发一次
    const throttledScroll = _.throttle(handleScroll, 1000);

    // 监听滚动事件
    window.addEventListener('scroll', throttledScroll);
</script>
  • 解释
    • 当用户滚动页面时,throttledScroll 函数会在 1 秒内最多触发一次,避免滚动时回调函数被频繁调用。
    • 这优化了页面滚动的性能,特别是在回调函数较为复杂时。

示例:结合 leading 和 trailing 选项

假设我们希望在用户第一次触发事件时立即执行函数,并在停止触发 1 秒后再次执行。

<input type="text" id="input-field" placeholder="Type something...">

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
<script>
    // 假设这是一个处理输入的函数
    function handleInput(value) {
        console.log('Input value processed:', value);
    }

    // 使用 debounce 函数,并配置 leading 和 trailing 选项
    const debouncedInput = _.debounce(function(event) {
        handleInput(event.target.value);
    }, 1000, { leading: true, trailing: true });

    // 监听输入框的输入事件
    document.getElementById('input-field').addEventListener('input', debouncedInput);
</script>

方法二:自定义防抖、节流函数

(1)在utils文件夹下创建lodash.ts文件,里面定义防抖节流函数

// 防抖函数
export function debounce(fn: Function, delay: number) {
  let timer: ReturnType<typeof setTimeout> | null = null;

  return function (this: any, ...args: any[]) {
    // 清除上一个定时器
    if (timer) {
      clearTimeout(timer);
    }

    // 设置新的定时器
    timer = setTimeout(() => {
      fn.apply(this, args); // 使用apply确保this和参数正确传递
    }, delay);
  };
}

  
// 节流函数
export function throttle(fn: Function, delay: number) {
  let lastTime = 0;

  return function (this: any, ...args: any[]) {
    const now = Date.now();

    // 如果距离上次执行时间已超过指定时间间隔,则执行函数
    if (now - lastTime >= delay) {
      lastTime = now;  // 更新上次执行时间
      fn.apply(this, args);
    }
  };
}

(2)应用

防抖

  • 方式一:
<template>
  <div>
    <input v-model="searchText" placeholder="输入搜索内容" />
    <button @click="handleSubmit">提交</button>
  </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue';
import { debounce } from '@/utils/debounce';  // 引入自己写的防抖函数

// 1. 声明响应式数据
const searchText = ref<string>('');

// 2. 防抖函数,延迟1000毫秒执行提交操作
const submitForm = (val: string) => {
  console.log('提交的搜索值:', val);
  // 在这里执行提交操作
};

// 3. 使用防抖函数包装提交操作
const handleSubmit = debounce(() => {
  submitForm(searchText.value);  // 使用当前输入的值执行提交操作
}, 1000); // 防抖延迟设置为1000毫秒

</script>
  • 方式二:
<template>
  <div>
    <input v-model="searchText" placeholder="输入搜索内容" />
    <button @click="submitForm(searchText)">提交</button>
  </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue';
import { debounce } from '@/utils/debounce';  // 引入自己写的防抖函数

// 1. 声明响应式数据
const searchText = ref<string>('');

// 2. 定义提交表单操作
const submitForm = debounce((val: string) => {
  console.log('提交的搜索值:', val);
  // 在这里执行提交操作
}, 1000);  // 防抖延迟设置为1000毫秒

</script>

节流

<template>
  <div @scroll="handleScroll" style="height: 300px; overflow-y: scroll;">
    <!-- 模拟内容,超出容器高度以启用滚动 -->
    <div style="height: 1000px;">滚动内容</div>
  </div>
</template>

<script lang="ts" setup>
import { throttle } from './debounce';  // 引入节流函数

// 1. 定义滚动事件处理函数(节流)
const handleScroll = throttle(() => {
  console.log('滚动事件触发');
  // 在这里处理滚动事件,例如加载更多内容
}, 200);  // 每200毫秒只执行一次

</script>
<template>
  <div @scroll="handleScroll" style="height: 300px; overflow-y: scroll;">
    <!-- 模拟内容,超出容器高度以启用滚动 -->
    <div style="height: 1000px;">滚动内容</div>
  </div>
</template>

<script lang="ts" setup>
import { throttle } from './debounce';  // 引入节流函数

// 1. 定义滚动事件处理函数(节流)
const handleScroll = throttle(() => {
  console.log('滚动事件触发');
  // 在这里处理滚动事件,例如加载更多内容
}, 200);  // 每200毫秒只执行一次

</script>

应用场景

防抖 (debounce):

手抖了。。。多点了好几次,一定时间内只执行一次。(年纪大了手抖)

  • 功能:只有在用户停止触发事件一段时间后,才会执行回调函数。
  • 应用场景:输入框搜索、窗口大小调整(resize)、表单提交等。

节流 (throttle):

好比点了两次下拉刷新列表页面,他不会马上直接执行两次,是在你定义的一定时间间隔前提前,先执行第一次在执行第二次

  • 功能:在指定的时间间隔内,只执行一次函数。如果触发频繁,函数执行会被限制在每个时间间隔内最多执行一次。
  • 应用场景:滚动事件、鼠标移动事件、resize 事件等。

附:安装和引入问题

问题描述: 新手在使用 Vue-lodash 时,可能会遇到安装和引入的问题。

解决步骤:

确保已经正确安装了 Vue 和 lodash。

使用 npm 或 yarn 安装 Vue-lodash:

npm install --save vue-lodash lodash

yarn add vue-lodash lodash

在你的 Vue 项目中引入 Vue-lodash 和 lodash:

import Vue from 'vue';
import VueLodash from 'vue-lodash';
import lodash from 'lodash';

总结 

到此这篇关于VUE前端实现防抖节流Lodash工具库的文章就介绍到这了,更多相关VUE前端防抖节流Lodash内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Vue3+TypeScript实现鼠标框选功能

    基于Vue3+TypeScript实现鼠标框选功能

    这篇文章主要介绍了基于Vue3+TypeScript实现鼠标框选功能,文中通过代码示例给大家讲解的非常纤细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-07-07
  • 解决el-date-picker 宽度溢出浏览器的问题

    解决el-date-picker 宽度溢出浏览器的问题

    这篇文章主要介绍了解决如何el-date-picker 宽度溢出浏览器问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-07-07
  • webpack项目中使用vite加速的兼容模式详解

    webpack项目中使用vite加速的兼容模式详解

    这篇文章主要为大家介绍了webpack项目中使用vite加速的兼容模式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • vant IndexBar实现的城市列表的示例代码

    vant IndexBar实现的城市列表的示例代码

    这篇文章主要介绍了vant IndexBar实现的城市列表的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 用vue 实现手机触屏滑动功能

    用vue 实现手机触屏滑动功能

    这篇文章主要介绍了用vue 实现手机触屏滑动的功能,文中通过示例代码给大家介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Vue安装浏览器开发工具的步骤详解

    Vue安装浏览器开发工具的步骤详解

    这篇文章主要介绍了Vue安装浏览器开发工具步骤详解,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • Vue.prototype详解及使用方式

    Vue.prototype详解及使用方式

    这篇文章主要介绍了Vue.prototype详解及使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • vue-property-decorator的使用解读

    vue-property-decorator的使用解读

    这篇文章主要介绍了vue-property-decorator的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • vue实现带缩略图的轮播图效果

    vue实现带缩略图的轮播图效果

    这篇文章主要为大家详细介绍了如何使用vue实现带缩略图的轮播图效果,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的可以参考下
    2024-02-02
  • 如何用vue封装axios请求

    如何用vue封装axios请求

    对axios进行封装以及将API接口按业务模块统一管理,有助于我们简化代码,方便后期维护。本文介绍了如何用vue封装axios请求,感兴趣的同学,可以参考下。
    2021-06-06

最新评论