首页 > 其他分享 >Input 输入框的 防抖和节流 (闭包的应用)

Input 输入框的 防抖和节流 (闭包的应用)

时间:2022-12-08 14:33:19浏览次数:34  
标签:闭包 防抖 节流 timer 输入框 value fn wait

// 防抖点击之后过了wait才响应,如果一直点,就一直没有响应,直到你停下来后,wait后执行。防抖是一进来就清,然后wait后再做
export function antishake<T>(fn: T, wait: number): () => void { //第一个参数是函数 第二个参数是毫秒值
  let timer: NodeJS.Timeout //声明一个变量来接收延时器 初始值为null
  return (...args) => {
    clearTimeout(timer)
    timer = setTimeout(() => {
      typeof fn === 'function' && fn(...args) //调用这函数
    }, wait);
  }
}

// 节流, 每wait执行一次,如果你一直点,就过2s执行一次,过wait再执行一次。<br /> 节流是 一进来就先看有没有,有的话就啥都不做,没有的话再做 ,做完清
export function throttle<T>(fn: T, wait: number): () => void {
  let timer: NodeJS.Timeout | null //节点闸
  return function (...args) {
    if (timer) return //null false 不是null结果减少true 如果上传没有我就直接跳过 没有人我就上去
    timer = setTimeout(() => {
      typeof fn === 'function' && fn(...args) //调用这函数
      timer = null //做完之后重新关闭节点闸
    }, wait);
  }
}

以上是防抖 节流函数。

应用: Input 输入框, 输入框搜索

import React, { ChangeEvent, useCallback } from 'react';
import { Input, ConfigProvider, Button, } from 'antd';
import { antishake, throttle } from './utils/throttle';

const App = () => {
  // 加useCallback 用来缓存函数,不然input改变的时候,会创建多次 fetchSearchValue函数,里面的console也就会执行多次。就不能防抖了
  const fetchAntishake: (value: string) => void = useCallback(antishake((value: string) => {
    console.log(value, 'Antishake');
  }, 2000), []);

  const fetchThrottle: (value: string) => void = useCallback(throttle((value: string) => {
    console.log(value, 'Throttle');
  }, 2000), []);

  const onInputChange = (e: ChangeEvent) => {
    fetchAntishake((e.target as HTMLInputElement).value);
    fetchThrottle((e.target as HTMLInputElement).value);
  };
  const goTo = () => {
    console.log('2222222');
    window.open(`${window.origin}/testBiBao`, '_self'); // '_self _blank'
  };

  return (
    <ConfigProvider
      theme={{
        token: {
          colorPrimary: 'red',
        },
      }}
    >
      <div style={{ display: 'flex', alignItems: 'center', flexDirection: 'column', justifyContent: 'center', height: 800 }}>
        <Input placeholder="input search text" onChange={onInputChange} style={{ width: 500 }} />
        <br />
        <Button onClick={goTo}>跳转到闭包</Button>
      </div>
    </ConfigProvider>);
}
export default App;

以下是 执行结果。可以看到 节流执行了多次,防抖只执行一次

 

 注意: 在onChange里面调用函数,要使用useCallback ,缓存函数,否则就会出现, 防抖节流失效,函数被创建多次的现象

 

标签:闭包,防抖,节流,timer,输入框,value,fn,wait
From: https://www.cnblogs.com/zpy521hl/p/16965987.html

相关文章

  • lodash防抖和节流简单使用
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"c......
  • 彻底理解Python中的闭包和装饰器(上)
    什么是闭包闭包(Closure)其实并不是Python独有的特性,很多语言都有对闭包的支持。(当然,因为Python是笔者除C/C++之外学习的第二门语言,所以也是第一次遇到闭包。)简而言之,闭包实......
  • 彻底理解Python中的闭包和装饰器(下)
    上篇讲了Python中的闭包,本篇要讲的装饰器就是闭包的一个重要应用。如果你还不知道什么是闭包,猛戳这里阅读:彻底理解Python中的闭包和装饰器(上)什么是装饰器装饰器的作用是......
  • python 函数闭包(二)
      程序开始执行,执行到test()函数,不执行继续往下执行,当遇到test(100)调用函数的时候,将实参100传给形参number,然后又执行到内部的test_in()函数,程序不执行,执行......
  • JavaScript——输入框、计时器
    JavaScript——输入框、计时器<!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <title></title> </head> <bodyonload="get_time()"> <!--<formaction......
  • python闭包使用(一)
     在python中,当定义了一个函数的时候,函数名实际上是定义了一个变量,指向了一片定义好的函数体,这意味着函数名,也就是定义了一个变量,这个变量存储着所定义的函数的引用......
  • JS—节流与防抖
     一、js防抖和节流在进行窗口的resize、scroll、输出框内容校验等操纵的时候,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常之差。那么为了前端......
  • Go | 闭包的使用
    闭包基本介绍闭包就是一个函数和其相关的引用环境组合的一个整体好处:保存引用的变量,下次继续使用,不会销毁下面通过闭包的方式,写一个数字累加器,体验一下闭包的妙处......
  • 防抖,节流
    let timer=nullclearTimeout(timer)timer=setTimeout(()=>{console.log("防抖")},1000)防抖:在一定时间内只执行最后一次操作,多用于做输入框搜索节流:一定时......
  • Swift闭包简要概述
    1.闭包闭包是一个捕获了外部变量或者常量的函数,可以有名字的函数,可以是匿名的函数,也可以是不捕获外部变量的函数。所以可以说闭包是特殊的函数。闭包是自包含的函数代码块,可......