Функция, переданная в useEffect
, может возвращать функцию очистки. Функция очистки запускается до удаления компонента из пользовательского интерфейса, чтобы предотвратить утечки памяти.Кроме того, если компонент выполняет рендеринг несколько раз (как обычно), предыдущий эффект очищается перед выполнением следующего эффекта.
В вашем случае, так как функция handlePopAlert
должна вызываться на основе идентификатора, переданного из реквизита, эффект должен запускаться всякий раз, когда изменяется id, ttl
, для которого вы передаете второй аргумент вuseEffect
как идентификатор и ттл
const Alert = (props) => {
const { alert: { id, ttl }, handlePopAlert } = this.props
useEffect(() => {
const timeout = setTimeout(() => {
handlePopAlert(id)
}, ttl)
return () => {
clearTimeout(timeout);
}
}, [id, ttl]);
return (...)
}