Попытка создать задержку для компонента реакции, который имеет поле ввода, которое обновляется при изменении.
Вот код:
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
. - person YanivGK   schedule 16.07.2020event.persist()
, но это было не так. - person YanivGK   schedule 16.07.2020useRef
для хранения/обработки/ссылки на обратный вызов. Вот как к этому подходят существующие хуки, такие как useDebouncedCallback. Существует отличная статья оuseRef
с такой функциональностью, как useInterval. - person Alexander Staroselsky   schedule 16.07.2020