【发布时间】:2021-10-28 20:58:37
【问题描述】:
我正在尝试在一个小型/测试 React 应用程序中实现去抖动。
它只是一个从 API 获取数据的应用程序,它有一个用于自动完成的文本字段。
import React, { useEffect, useState, useMemo } from 'react';
import axios from 'axios';
const API = 'https://jsonplaceholder.typicode.com/posts';
const AutoComplete2 = () => {
const [ text, setText ] = useState("")
const [ posts, setPosts ] = useState([])
useEffect(() => {
async function fetchData() {
const data = await axios.get(API);
if(parseInt(data.status) !== 200) return;
setPosts(data.data)
}
fetchData();
}, [])
const handleTextChange = (event) => setText(event.target.value);
const handleSelectOption = (str) => setText(str);
const showOptions = useMemo(() => {
if(text === '') return;
const showPosts = [...posts].filter((ele) => ele.title.toLowerCase().includes(text.toLowerCase()));
if(showPosts.length === 1) {
setText(showPosts[0].title);
} else {
return (
<div>
{showPosts.map((obj, index) => {
return (
<div key={index} >
<span onClick={() => handleSelectOption(obj.title)} style={{cursor: 'pointer'}}>
{obj.title}
</span>
</div>
)
})}
</div>
)
}
}, [text, posts])
// addding debounce
const debounce = (fn, delay) => {
let timer;
return function() {
let context = this;
let args = arguments;
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(context, args)
}, delay);
}
}
const newHandleTextChange = ((val) => debounce(handleTextChange(val), 5000));
return (
<div>
<input type="text" value={text} onChange={newHandleTextChange} />
{showOptions}
</div>
)
}
export default AutoComplete2;
应用程序有效,但去抖动无效。我添加了 5 秒等待以清楚地查看它是否正常工作,但是每次我更改输入文本时,它都会毫无延迟地调用该函数。有谁知道为什么会这样?
谢谢
【问题讨论】:
-
好像你在调用
handleTextChange时立即调用了newHandleTextChange。也许你应该让它成为一个匿名函数?const newHandleTextChange = ((val) => debounce(() => handleTextChange(val), 5000)) -
我很好奇你在这里想要什么效果;我经常看到使用
useEffecthooks 实现去抖动 -
@Nick 在显示选项列表之前等待的想法,例如 500 毫秒。比如我想等待500ms,因为这通常是用户输入单词的时间,所以过滤器会根据输入的单词进行过滤
标签: reactjs debouncing