首页 > 其他分享 >vue项目使用lodash节流防抖函数问题与解决

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

时间:2023-10-08 23:35:16浏览次数:35  
标签:防抖 vue throttle 函数 number add options 节流 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,throttle,函数,number,add,options,节流,lodash
From: https://www.cnblogs.com/cry0-0/p/17750472.html

相关文章

  • vue $refs 获取的结果有时候是数组
    在工作的时候要从接口读取数据,生成一个动态的表单首先做的就是绑定ref然后使用const{proxy}=getCurrentInstance();来读取ref,看了半天数据怎么不对,控制台打印后,发现是一个数组后来观察到只要是使用v-for生成的获取ref时,即使没有重复,结果也是数组,可能是作者在v-for中为了......
  • App.vue 的组成部分
    组件化:页面可拆分成一个个组件,每个组件有着独立的结构、样式、行为组件分类:普通组件、根组件根组件:整个应用最上层的组件,包裹所有普通小组件一个根组件 App.vue,包含三个部分 App.vue文件(单文件组件)的三个组成部分:结构、样式、行为结构通过template标签提供,行为通过scr......
  • Vue工程中 main.js 的作用、npm run serve的执行流程
    1.内容:importVuefrom'vue'   //导入Vue核心包importAppfrom'./App.vue'  //导入App.vue根组件Vue.config.productionTip=false  //提示当前处于什么环境(生产环境/开发环境),fasle是什么提示都没有,改为true才提示,但通常写falsenewVue({   ......
  • Vue项目的使用
    解析Vue项目//1为什么浏览器中访问某个地址,会显示某个页面组件 -根组件:App.Vue必须是:<template><divid="app"><router-view></router-view></div></template> -配置路由: //先导入 importy......
  • Vue-router、localStorange
    Vue-Router的使用作用: 借助于router可以实现单页面组件之间的跳转this.router的一些使用方法:this.$router.push(path):相当于点击路由链接(可以返回到当前路由界面)this.$router.replace(path):用新路由替换当前路由(不可以返回到当前路由界面)this.$router.......
  • vue封装搜索组件,自定义elment搜索组件
    组件案例<template><divclass="dialog-search"><el-form:inline="true"ref="ruleForm":model="formInline"class="demo-form-inlinetop-screen"><divclass="to......
  • vue3子组件页面不更新
    写在前面这是一次滑铁卢,整整找了半天时间...项目结构我有一个组件A,A中定义了一个属性data:Object,A中将data赋值给了一个reactive类型的对象R。页面中均使用R。现象描述当调用A的父组件P更新了A的data后,A的页面不更新问题分析P更新A后,A是一个新的对象,但R仍然引用旧对象,导致产......
  • 创建Vue实例方式一(基于核心包)
    基于核心包创建Vue实例核心包就是Vue.jsvue2地址:https://v2.cn.vuejs.org/vue3地址:https://cn.vuejs.org/注意开发版本和生产版本,学习建议使用开发版本  ......
  • vue3绘制和回显多边形
    参考了这个:https://blog.csdn.net/weixin_42178050/article/details/130012696将其从vue2的语法改成了vue3,效果如下:代码如下:<template><divclass="app-container"><divclass="d-flexj-center"><el-container><el......
  • vue前端接收数组;
    后端 $this->assign('info',$expert);如果是数组/对象,需要在接收页面这样写:在data内变量赋值: info: <?phpechojson_encode($info);?>  另外有其他写法:  $this->assign('info',1); 如果是单个值:在data内变量赋值: info: ‘{$info}’翻译搜索......