Vue lodash.debounce防抖函数

本文介绍在Vue中如何利用lodash的防抖函数优化用户体验,避免频繁触发事件导致的性能问题,通过实例展示了lodash.debounce的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vue 中使用防抖函数

这篇文章也是衔接我之前文章,输入内容延迟显示。

一般防抖函数,一般都是自己写,或者直接搜的类似这种

function debounce(fn,wait){
    var timer = null;
    return function(){
        if(timer !== null){
            clearTimeout(timer);
        }
        timer = setTimeout(fn,wait);
    }
}

Vue官网Demo

https://cn.vuejs.org/v2/guide/computed.html#侦听器

我看到Vue官网 侦听器 使用了lodash这个组件

created: function () { 
// _.debounce 是一个通过 Lodash 限制操作频率的函数。 
// 在这个例子中,我们希望限制访问 yesno.wtf/api 的频率 
// AJAX 请求直到用户输入完毕才会发出。想要了解更多关于 
// _.debounce 函数 (及其近亲 _.throttle) 的知识,
// 请参考:https://lodash.com/docs#debounce
this.debouncedGetAnswer = \_.debounce(this.getAnswer, 500)
}

我就在想既然,官网都不用自己手写的,那我也用一下这个。

lodash.debounce

先看 https://lodash.com/docs#debounce 文档

由于我只用了防抖,所以我只安装防抖函数

npm i --save lodash.debounce

使用


import debounce from 'lodash.debounce'

textChange: debounce(function() {
        //注意这里如果使用箭头函数的话, this为 undefined https://github.com/vue-styleguidist/vue-docgen-api/issues/23
         // do sth
}, 300)

总结

已经有轮子的话,就不要自己造轮子,当然练习的时候可以自己造。

### 如何在 Vue 项目中使用 Lodash 的 `debounce` 函数 #### 安装 Lodash 或者 Lodash-es 为了能够在 Vue 项目中使用 Lodash 提供的功能,首先需要通过 npm 或 yarn 来安装 Lodash: ```bash npm install lodash ``` 或者是对于希望采用 ES 模块语法的开发者来说,可以选择安装 Lodash-es 版本[^3]。 #### 将 Lodash 添加至全局或组件内部引入 一种常见的做法是将 Lodash 添加到 Vue 实例的原型上以便于在整个应用范围内访问它。可以在项目的入口文件(通常是 main.js)里做如下配置: ```javascript // 导入整个库 import _ from 'lodash'; Vue.prototype.$_ = _; ``` 不过需要注意的是,当尝试直接利用这种方式在方法体内调用诸如 `_ .debounce()` 这样的高阶函数时可能会遇到上下文丢失的问题——即 `this` 变量不再指向当前 Vue 组件实例而是变成了未定义(`undefined`)的情况[^1]。 因此更推荐的做法是在具体使用的组件内局部导入所需的工具函数而不是依赖全局变量的方式。例如,在一个特定的 `.vue` 文件顶部加上这样的声明语句即可实现按需加载并保持正确的上下文环境: ```javascript import { debounce } from 'lodash'; // 如果使用的是 lodash-es 则应改为 import debounce from 'lodash-es/debounce' ``` #### 创建带有防抖功能的方法 下面展示了一个完整的例子来说明怎样创建具有延迟响应特性的输入框事件处理器,并确保其中能够正常获取到组件内的属性值如 `searchText` 等数据成员: ```html <template> <div class="example"> <input v-model="query" @keyup.enter="handleSearch"/> </div> </template> <script> export default { data() { return { query: '', searchText: '' }; }, created() { this.debouncedGetRemote = debounce(this.getRemote, 800); }, methods: { handleSearch(event){ event.preventDefault(); this.debouncedGetRemote(); }, getRemote(){ console.log('查询关键词:', this.query); // 假设这里的逻辑是要发送 HTTP 请求并将返回的结果赋给 searchText 属性... this.searchText = "模拟搜索结果"; } } }; </script> ``` 在这个案例里面,注意到了几个要点: - **不要把箭头函数作为 debouce 方法的第一个参数传入**,因为那样会改变原本期望的作用域链从而导致无法正确取得 `this` 对象所指代的内容; - 使用 `created` 生命周期钩子初始化经过装饰过的异步操作函数副本 (`debouncedGetRemote`); - 当实际触发键盘按下动作之后再显式地去调用这个已经过处理的新版函数;这样做可以有效防止频繁提交表单的同时也保证了每次都能拿到最新的用户输入信息[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值