Если вы используете компонент класса, вы можете попробовать что-то вроде этого.
import React from "react";
class App extends React.Component {
state = {claps: 0}
timeout = null;
sendClap = () => {
this.setState({claps: this.state.claps + 1})
if(!this.timeout){
this.timeout = setTimeout(() => {
console.log("Send claps", this.state.claps);
clearTimeout(this.timeout);
this.timeout = null;
}, 3000)
}
}
render(){
console.log(this.state.claps);
return <button onClick={this.sendClap}>Clap</button>
}
}
export default App;
Я очищаю таймер при его запуске и повторно инициализирую при следующем обновлении состояния.Также необходимо очистить таймер при размонтировании компонента.
Если вы используете функциональный компонент с перехватчиками, вы можете попробовать что-то вроде
import React, {useState, useRef} from "react";
export default () => {
const [claps, setClaps] = useState(0);
const clapsRef = useRef(0);
clapsRef.current = claps;
const timeout = useRef(null);
const sendClap = () => {
setClaps(claps + 1);
if(!timeout.current){
timeout.current = setTimeout(() => {
console.log("Send claps", clapsRef.current);
clearTimeout(timeout.current);
timeout.current = null;
}, 3000)
}
}
console.log(claps);
return <button onClick={sendClap}>Clap</button>
}
Здесь я использую useState для повторной визуализации компонента и useRef для захвата последнего состояния для тайм-аута для получения последней ссылки на состояние.