美文网首页
巧用函数防抖进行批量请求

巧用函数防抖进行批量请求

作者: 柏丘君 | 来源:发表于2018-06-05 11:28 被阅读0次

在近期的一个项目中,有一个树形菜单的功能,使用了 ElementUI 的 Tree 控件。页面上的效果如图所示:

页面效果.png
在 Tree 控件中,需要在叶子节点被选中时请求后台的接口。Tree 控件有一个 check-change 属性,该属性是个方法,用来在节点被选中后调用。每次有节点被选中后,都会调用这个方法,当选择上级的节点时,下级的所有节点也会被选择,因此在批量选择时,可能会执行很多次 check-change 方法。
如果在选择后,还需要进行类似接口请求等高耗操作,会非常影响浏览器性能。在我的代码中,每个叶子节点被选中时,就会向后台发起一个请求获取节点详情,如果是批量选择,就会发出大量的 HTTP 请求,浏览器顿时卡住了,半天才恢复过来,即使是强悍的 Chrome 也难逃厄运。
下面是我代码中封装的组件:
<template>
    <div
        class="tree-box"
        :id="treeId"
    >
        <el-tree
            :props="props"
            :load="load"
            lazy
            @check-change="handleCheckChange"
            @node-click="handleNodeClick"
            ref="tree"
            :show-checkbox="checkable"
            :highlight-current="true"
        >
...

组件的 handleCheckChange 方法定义如下:

handleCheckChange(data){
    if(!data.leaf) return;
    if(choosen){
        this.check(data);
    }else{
        this.unCheck(data);
    }
},

性能问题的产生不在于 handleCheckChange 方法,而在于选中/取消选中后的回调函数 checkunCheck(这两个函数是通过 props 传入的)。在 checkunCheck 函数中,每有一次点击,就会执行一次高耗操作,导致界面卡顿。我的解决方案是为 checkunCheck 应用防抖机制。
下面是 check 函数的代码:

async check(data){
    // 加锁,禁止添加已存在的元素
    const lockFlag = this.checkedQueue.find(...);
    if(lockFlag) return;
    clearTimeout(this.check.timer);
    this.checkedQueue.push(data)
    this.check.timer = setTimeout(async () => {
        // 根据 checkedQueue 进行批量处理
        const res = await httpRequest()
        // 处理结果集
        ...
        // 清空 checkedQueue
        this.checkedQueue = []
    },20)
}

上面是一个很经典的防抖代码,通过对 check 函数设置防抖,用来批量“收集”被选择的子节点信息,然后后端提供一个批量请求的接口,执行请求即可。
通过这个例子,我明白了函数节流和函数防抖不只可以应用于事件处理中,函数防抖和函数节流是针对函数频繁调用时引起性能问题的通用解决方案。针对批量选择,函数防抖可以用来“检测变化”,即一段时间后选择的内容没有发生变化,就可以针对这一批次的选择进行处理了,防抖函数的特性非常适合做这样的事情,且效果比检测数组长度变化的方案或者定时器方案要好,防抖函数天生适合用来做批量选择时的“变更检测”。对于其他函数调用中的类似需求,也可以使用防抖或者节流的思想来帮助我们解决问题。

完。

相关文章

  • 巧用函数防抖进行批量请求

    在近期的一个项目中,有一个树形菜单的功能,使用了 ElementUI 的 Tree 控件。页面上的效果如图所示: ...

  • debounce vs throttle

    常说的函数防抖和函数节流,都是为了不频繁触发某类操作或者接口请求。debounce(防反跳): 防抖throttl...

  • 防抖节流、跨域问题

    防抖节流 防抖: 防止用户在短时间内多次进行请求操作 (和点击或者滚动无关,只和发请求的频率有关) 防抖有N种方式...

  • 节流与防抖

    节流函数和防抖函数都是用来防止函数被频繁触发的。函数节流与防抖需要做的是忽略一些事件请求以降低触发回调的频率。 节...

  • input输入搜索防抖函数

    输入框搜索频繁请求接口,防抖函数可有效控制接口请求完成后,间隔设置的时长再次请求,避免一次请求未结束又进行了下一次...

  • javaScript 防抖函数

    一. 防抖函数的定义与使用 防抖函数的定义 防抖函数的调用 二. 防抖函数应用场景 其实在HTML 和javaSc...

  • 函数节流与函数防抖

    节流与防抖的概念 函数节流与函数防抖的目的都是为了减少用户对服务器不必要的请求次数,以此提高服务器性能的函数。节流...

  • Javascript 基础

    1、函数防抖和函数节流 【《javascript高级程序设计》里,函数节流是这里讲的函数防抖。】函数防抖: 在事件...

  • 节流/防抖函数 和 better-scroll解决移动端滑动卡顿

    节流函数 就像游戏cd一样,一定时间之内执行一次 防抖的应用场景,页面窗口滑动 防抖函数 原理:两张图片请求下来的...

  • JS函数防抖

    JS 中的函数防抖 一、什么是函数防抖? 概念: 函数防抖(debounce), 就是指触发事件后,在 n 秒内函...

网友评论

      本文标题:巧用函数防抖进行批量请求

      本文链接:https://www.haomeiwen.com/subject/nhdpsftx.html