debounce防抖,我终于悟了,你呢

使用场景

常见的有例如搜索框输入,鼠标事件,窗口resize等极为敏感的事件中需要用到

使用目的

可以等一等再执行,例如在搜索框搜索时,不用每输入一个字符都发起一次请求,而是等一段时间后再带上最后一次的搜索条件去发起请求

实例

// debounce
const debounce = (func, delay) => {
  let timeout;
  return (...param) => {
    if (timeout) {
      clearTimeout(timeout);
    }
    timeout = setTimeout(function () {
      func(...param);
    }, delay);
  };
};
const log = debounce(() => console.log("call"), 3000);

log(); // #1
log(); // #2
log(); // #3

可以将其copy到浏览器console台查看结果
在这里插入图片描述

debounce原理

3次log()几乎是在0.00几秒之内同步完成的,
在0-------1s过程中

log#1先执行,得到一个timeout#1

log#2执行,看到前面已经有timeout,就将第一个timeout#1删了,生成自己的timeout#2并等待

log#3执行,同样看到前面已经有timeout,就将前面的timeout#2删了,生成自己的timeout#3并等待3秒完成

最终3秒之后只执行了log#3

这是一个鸠占鹊巢,从0开始的骚操作

———补充——————————————————————————————————————

最后来个项目中实际用到的例子吧

antd 搜索框做防抖搜索

封装useDebounce钩子

export const useDebounce = <V>(value: V, delay?: number) => {
	//对搜索框输入,鼠标点击等事件实现防抖,如果delay时间内该事件仍然被触发,则摧毁之前的,重新等待delay时间
	const [debouncedValue, setDebouncedValue] = useState(value)
	useEffect(() => {
		let timeout = setTimeout(() => {
			setDebouncedValue(value)
		}, delay)
		//卸载组件之前销毁定时器
		return () => clearTimeout(timeout)
	}, [value, delay])
	return debouncedValue;
}

封装debouncedSearch.tsx

import { useEffect, useState } from 'react';

export const DebouncedSearch = (props: any) => {
	//保证初始化时不执行,只在debouncedSearch改变时执行
	const [isInit, setInit] = useState(true);
	const [search, setSearch] = useState<string | null | undefined>(null);
	const debouncedSearch = useDebounce(search, 500);
	const { onSearch } = props;

	useEffect(() => {
		if (isInit) {
			setInit(false)
		} else {
			onSearch(debouncedSearch);
		}
	}, [debouncedSearch]);

	return (
		<Input.Search
			{...props}
			onChange={async (e) => {
				if (e.target.value.trim() === '') {
					setSearch(undefined);
				} else {
					setSearch(e.target.value);
				}
			}}
		/>
	);
};

使用debouncedSearch

<DebouncedSearch
	placeholder="搜索"
	onSearch={e=>{ /*做点你想做的,查询,搜索等*/ }}
/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,你需要安装 `lodash` 库: ``` npm install lodash ``` 然后,在你的 React 组件中引入 `lodash`: ``` import _ from 'lodash'; ``` 接着,你可以使用 `_.debounce` 方法来对你的事件处理函数进行。例如,在你的组件中有一个输入框,当输入框内容发生变化时你希望触发一个事件处理函数,但是只有在用户停止输入一段时间后才真正触发,那么你可以这样写: ``` import _ from 'lodash'; class MyComponent extends React.Component { handleChange = _.debounce((event) => { // 处理事件 }, 300); render() { return <input onChange={this.handleChange} />; } } ``` 在这个例子中,我们使用了 `_.debounce` 方法来包装我们的事件处理函数 `handleChange`。`_.debounce` 方法接受两个参数: - 第一个参数是我们要进行的函数。 - 第二个参数是延迟的时间,单位是毫秒。 在上面的例子中,我们设置了延迟时间为 300 毫秒。这意味着,当用户在输入框中输入内容时,每隔 300 毫秒,`handleChange` 函数就会被调用一次。 注意,这里的是在组件级别进行的,也就是说,如果你有多个输入框,它们的 ### 回答2: 在React前端项目中,如果要在UI组件Input中使用lodash的debounce函数,可以按照以下步骤进行: 1. 首先,确保已经安装lodash库。可以通过运行`npm install lodash`命令来安装。 2. 在需要使用debounce函数的组件中,引入lodash库的debounce函数。可以使用`import debounce from 'lodash/debounce';`语句来引入。 3. 在Input组件的构造函数中,声明一个时间间隔变量(例如`debounceInterval`),用于设置debounce的时间间隔。 4. 在Input组件的事件处理函数(例如onChange事件)中,使用debounce函数对事件处理函数进行包装。 5. 在包装的函数中,调用debounce函数,传入事件处理函数以及时间间隔变量。 下面是一个示例代码: ```javascript import React, { Component } from 'react'; import debounce from 'lodash/debounce'; class Input extends Component { constructor(props) { super(props); this.state = { inputValue: '', }; this.debounceInterval = 300; // 设置debounce的时间间隔为300毫秒 this.handleInputChange = this.handleInputChange.bind(this); this.debouncedInputChange = debounce(this.handleInputChange, this.debounceInterval); } handleInputChange(e) { // 处理输入框变化的逻辑 this.setState({ inputValue: e.target.value }); } render() { return ( <input type="text" value={this.state.inputValue} onChange={this.debouncedInputChange} // 使用debounce函数包装事件处理函数 /> ); } } ``` 以上就是在React前端项目中,在UI组件Input中使用lodash的debounce的方法。通过这种方式,可以减少频繁触发函数的次数,提升页面性能和用户体验。 ### 回答3: 在React前端项目中,使用lodash的debounce的方法如下: 首先,安装lodash库,使用以下命令进行安装: ``` npm install lodash ``` 然后,导入lodash库并引入debounce函数。在Input组件的文件中添加以下代码段: ```javascript import React, { useState } from 'react'; import { debounce } from 'lodash'; const Input = () => { const [inputValue, setInputValue] = useState(''); // 创建函数 const debouncedHandleInputChange = debounce((value) => { // 处理输入变化的逻辑 console.log(value); }, 500); // 设置延时时间为500毫秒 // 处理输入变化的函数 const handleInputChange = (event) => { const { value } = event.target; setInputValue(value); // 执行函数 debouncedHandleInputChange(value); }; return ( <input type="text" value={inputValue} onChange={handleInputChange} /> ); }; export default Input; ``` 在上面的代码中,我们首先通过useState来创建一个inputValue状态变量,并使用setInputValue函数来更新inputValue的值。 接下来,我们引入debounce函数,并使用它创建一个debouncedHandleInputChange函数。该函数将在输入变化后的500毫秒内只执行一次。 然后,我们定义handleInputChange函数来处理输入的变化。在这个函数中,我们首先更新inputValue的值,然后调用debouncedHandleInputChange函数。 最后,我们将Input组件渲染为一个input元素,并将inputValue绑定为输入框的值,同时将handleInputChange函数绑定到onChange事件。 这样,当用户输入时,debouncedHandleInputChange函数将被延迟执行,只有在用户停止输入500毫秒后才会被调用。这种方式可以避免频繁的输入导致的性能问题,提升用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值