vue项目使用lodash节流防抖函数问题解决方案

 更新时间:2023年10月09日 08:45:04   作者:自信可改变未来  
在lodash函数工具库中,防抖 _.debounce 和节流 _.throttle 函数在一些频繁触发的事件中比较常用,这篇文章主要介绍了vue项目使用lodash节流防抖函数问题与解决,需要的朋友可以参考下

背景

在lodash函数工具库中,防抖 _.debounce 和节流 _.throttle 函数在一些频繁触发的事件中比较常用。

防抖函数 _.debounce(func, [wait=0], [options=])

创建一个 debounced(防抖动)函数,该函数会从上一次被调用后,延迟 wait 毫秒后调用 func 方法。

参数

  • func (Function): 要防抖动的函数。
  • [wait=0] (number): 需要延迟的毫秒数。
  • [options=] (Object): 选项对象。
  • [options.leading=false] (boolean): 指定在延迟开始前调用。
  • [options.maxWait] (number): 设置 func 允许被延迟的最大值。
  • [options.trailing=true] (boolean): 指定在延迟结束后调用。

返回

  • (Function): 返回 debounced(防抖动)函数。

节流函数 _.throttle(func, [wait=0], [options=])

创建一个节流函数,在 wait 毫秒内最多执行 func 一次的函数。

参数

  • func (Function): 要节流的函数。
  • [wait=0] (number): 需要节流的毫秒。
  • [options=] (Object): 选项对象。
  • [options.leading=true] (boolean): 指定调用在节流开始前。
  • [options.trailing=true] (boolean): 指定调用在节流结束后。

返回

(Function): 返回 throttled(节流)的函数。

在vue中使用防抖节流函数的问题

踩坑1

防抖节流函数实际上起到一个“稀释”的作用,在vue项目中我们可能会这样写(节流为例)。

<template>
    <div>
        <button @click="add_throttle">加1</button>
        <h1>{{ number }}</h1>
    </div>
</template>
<script>
import { throttle } from 'lodash';
export default {
    data() {
        return {
            number: 1
        };
    },
    methods: {
        // add函数做节流处理
        add_throttle: throttle(this.add, 1000),
        add() {
            this.number++;
        }
    },
};
</script>

然后我们信心满满地F12打开控制台……

上面说 add 这玩意儿 undefined 了。

这其实是 this 的指向问题。实际上这里的 this 并不是vue实例(至于是什么,往下看你就知道了[doge]),所以自然不存在 add() 方法了。

踩坑2

既然直接使用 this.add() 不成,那我们换个思路,把 this.add() 放在函数里呢?

methods: {
    // 做节流处理
    add_throttle: throttle(() => {
        this.add();
    }, 1000),
    add() {
        this.number++;
    }
}

然后,自信满满地再次打开控制台……

第一眼,诶,没报错,于是点击按钮……

梅开二度……

其实还是 this 的指向问题。我们知道箭头函数是没有 this 的,所以这里的 this 相当于踩坑1里的 this ,让我们打印下,揭开它的庐山真面目。

methods: {
    // 做节流处理
    add_throttle: throttle(() => {
        console.log(this);
    }, 1000),
    add() {
        this.number++;
    }
}

好家伙,原来这里的 this 本身就是 undefined

解决

既然是this的指向问题,那么只要保证 this 指向vue实例就行了,箭头函数换成声明式函数。

methods: {
    // 做节流处理
    add_throttle: throttle(function () {
        this.add();
    }, 1000),
    add() {
        this.number++;
    }
}

结果很nice。

至于为什么,大概是lodash的 _.debounce 函数对this做了一些处理( _.throttle 函数本质还是调用了 _.debounce 函数),有兴趣的小伙伴儿可以看看_.debounce的源码。

到此这篇关于vue项目使用lodash节流防抖函数问题与解决的文章就介绍到这了,更多相关vue使用lodash节流防抖函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue实现锁屏功能的示例代码

    Vue实现锁屏功能的示例代码

    这篇文章主要为大家详细介绍了如何利用Vue实现简单的锁屏功能,文中的示例代码讲解详细,具有一定的参考价值,需要的小伙伴可以了解一下
    2023-06-06
  • vue项目中使用require.context引入组件

    vue项目中使用require.context引入组件

    本文主要介绍了vue项目中使用require.context引入组件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Vue 组件之间传值的主要方法

    Vue 组件之间传值的主要方法

    父组件向子组件传值,使用 props:可以通过在子组件上绑定 props,然后在父组件中通过 v-bind 绑定相应的数据来传递数据,这篇文章主要介绍了Vue 组件之间传值的方法,需要的朋友可以参考下
    2023-12-12
  • vue移动端自适应适配问题详解

    vue移动端自适应适配问题详解

    这篇文章主要介绍了vue移动端自适应适配问题,本文通过实例代码详解给大家介绍的非常详细,需要的朋友可以参考下
    2021-04-04
  • vue动态添加路由后刷新页面白屏问题及解决

    vue动态添加路由后刷新页面白屏问题及解决

    这篇文章主要介绍了vue动态添加路由后刷新页面白屏问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 使用ElementUI写一个前端分页查询的实例

    使用ElementUI写一个前端分页查询的实例

    本文主要介绍了使用ElementUI写一个前端分页查询的实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 基于vue.js无缝滚动效果

    基于vue.js无缝滚动效果

    这篇文章主要介绍了一个基于vue.js无缝滚动效果,文中给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01
  • ElementUI el-table 树形数据的懒加载的实现

    ElementUI el-table 树形数据的懒加载的实现

    当面对大量数据时,一次性加载所有数据可能会导致性能问题,我们可以实现树形数据的懒加载,本文主要介绍了ElementUI el-table 树形数据的懒加载,感兴趣的可以了解一下
    2024-06-06
  • Vue.js 中 ref 和 reactive 的区别及用法解析

    Vue.js 中 ref 和 reactive 的区别及用法解析

    在Vue.js中,ref主要用于创建响应式的引用,通过.value属性来访问和修改值,特别适用于需要频繁更改整个值的场景,而reactive则用于创建深度响应的对象或数组,本文给大家介绍Vue.js 中 ref 和 reactive 的区别及用法,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • element-UI el-table修改input值视图不更新问题

    element-UI el-table修改input值视图不更新问题

    这篇文章主要介绍了element-UI el-table修改input值视图不更新问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02

最新评论