Iwen's blog Iwen's blog
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • Linux
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
复盘
关于

Iwen

不摸鱼的哥哥
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • Linux
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
复盘
关于
  • Vue

  • Vue进阶

  • CSS

  • ES6

  • Base

  • Core

  • Array

  • Object

  • String

  • Async

  • Browser

  • Http

  • 性能优化

    • 节流防抖
    • 图片懒加载
    • Script的加载和执行
    • 防抖多列表的骚操作
    • 渲染几万条数据不卡住页面
    • 前端性能优化总结
  • 正则

  • 经典总结

  • 设计模式

  • 数据结构

  • 算法

  • 手写

  • TypeScript

  • 复盘
  • 性能优化
Mr.w
2020-11-29

防抖多列表的骚操作

# 防抖多列表的骚操作

看好了,这是一个防抖,对吧~~

function debounce(fn, interval) {
    let timer = null;
    return function (...args) {
        if(timer) clearTimeout(timer);
        timer = setTimeout(() => {
            fn.apply(this, args);
        }, interval);
    }
}
1
2
3
4
5
6
7
8
9

现在有一个需求:看下面的图片,每次增减数量的时候都需要发起请求,每个列表的需要请求的数据不一致,使用以上的防抖会导致:

如果我在防抖时间之内连续点击多个列表,那么结果可想而知,只会请求最后一个点击的。

因为函数指向的作用域处于同一个

那么,该怎么办呢~~

目前重构的新项目,使用原生JS开发的,没有用框架之类的,更没有组件可用,所以只能来改造防抖这个全局方法

这时候,万能的对象就来了~

把不同方法名 or 指定值,作为属性存起来,作为公共的方法,同一组里面的列表来指定不同属性值,这样就不会互相影响,各玩各的

<ul style="margin: 70px;">
    <li data-id="1">1111111</li>
    <li data-id="2">2222222</li>
    <li data-id="3">3333333</li>
    <li data-id="4">4444444</li>
    <li data-id="5">5555555</li>
</ul>
1
2
3
4
5
6
7
function sayHi(id){ console.log('hi', id) }

const oLi = document.querySelectorAll('li')

for(let i = 0; i < oLi.length; i++){
    oLi[i].addEventListener('click', function(){
        const id = this.getAttribute('data-id');
        debounce(sayHi, 1000, id)(id)
    })
}


// 完整代码
const timeout = {}
function debounce(fn, interval, type) {
    // 优先使用指定值作为属性,否则就用方法名
    const name = type ? type : fn.name;
    return function () {
        // 清除指定属性的定时器,再重新赋值
        clearTimeout(timeout[name])
        timeout[name] = setTimeout(() => {
            fn.apply(this, arguments);
        }, interval)
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Script的加载和执行
渲染几万条数据不卡住页面

← Script的加载和执行 渲染几万条数据不卡住页面→

最近更新
01
flex布局页面自适应滚动条问题
12-28
02
前后端分离开发请求接口跨域如何携带cookie的问题
12-28
03
怎么实现div长宽比固定width-height4比3
12-28
更多文章>
Theme by Vdoing | Copyright © 2017-2022 Iwen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式