【发布时间】:2020-07-16 15:16:11
【问题描述】:
尝试在具有随更改更新的输入字段的反应组件上创建延迟。
代码如下:
import React from 'react';
import Input from "@material-ui/core/Input";
import {debounce} from "lodash";
...
const SampleRow = () => {
let [newFriend, setNewFriend] = React.useState({name: '', lastSeen: '', contactIn: ''});
const onAddFriend = debounce(() => {
if(newFriend.name.length === 0){
return;
}
console.log(newFriend.name);
}, 2000);
return (
<TableRow>
<TableCell component="th" scope="row">
<Input
value={newFriend.name}
onChange={(event) => {
setNewFriend({...newFriend, name: event.target.value});
onAddFriend();
}}
placeholder={"Add friend"}
disableUnderline={true}
/>
</TableCell>
<TableCell align="left">{newFriend.lastSeen ? newFriend.lastSeen : ''}</TableCell>
<TableCell align="left">{newFriend.contactIn ? newFriend.contactIn : ''}</TableCell>
<TableCell align="left" className={classes.externalLinks}/>
</TableRow>
)
};
发生的情况是console.log 打印出每个更改(超时 2 秒后),并且不会取消之前的触发器。
问题是为什么会这样?又该如何解决呢?
我发现与复杂的
useDebounce逻辑或类组件类似的问题。没有找到这个问题的参考。
【问题讨论】:
-
您必须清除已调用的去抖动功能。
-
这不就是
debounce的全部概念吗?调用函数应该重置time-interval。 -
我认为函数的渲染可能会导致问题。我试过
event.persist(),但不是这样。 -
这正是您找到的解决方案“复杂”的原因。使用钩子,您需要使用
useRef来存储/处理/引用回调。这就是现有的钩子(如 useDebouncedCallback)处理它的方式。useRef上有一个很棒的 article,具有 useInterval 等功能。
标签: javascript reactjs react-hooks lodash debounce