Я создал компонент таймера обратного отсчета, который передает данные другому компоненту, и я использую setTimeout
. Компонент работает должным образом, но в моей консоли появляется предупреждение:
Предупреждение. Невозможно выполнить обновление состояния React для неустановленного компонента. Это неоперация, но она указывает на утечку памяти в вашем приложении. Чтобы исправить, отмените все подписки и асинхронные задачи в функции очистки useEffect.
Поскольку я использую setTimeout
в useEffect
Я пытался добавить clearInterval
в функцию возврата, но это не кажется, чтобы помочь. Ниже вы можете найти мой компонент:
export default function createEvent(WrappedComponent) {
const Event = props => {
const [{ endDate }] = useState(props);
const [days, setDays] = useState('');
const [hours, setHours] = useState('');
const [minutes, setMinutes] = useState('');
const [seconds, setSeconds] = useState('');
const interval = useRef();
useEffect(() => {
interval.current = setInterval(() => {
const date = moment.unix(endDate).format('MM DD YYYY, h:mm a');
const then = moment(date, 'MM DD YYYY, h:mm a');
const now = moment();
const countdown = moment(then - now);
const daysFormat = countdown.format('D');
const hoursFormat = countdown.format('HH');
const minutesFormat = countdown.format('mm');
const secondsFormat = countdown.format('ss');
setDays(`${daysFormat} days`);
setHours(hoursFormat);
setMinutes(minutesFormat);
setSeconds(secondsFormat);
return () => {
clearInterval(interval.current);
interval.current = null;
};
}, 1000);
}, []);
return (
<WrappedComponent
days={days}
hours={hours}
minutes={minutes}
seconds={seconds}
{...props}
/>
);
};
return Event;
}
Если я попытаюсь имитировать очистку из другого места, добавив еще один useEffect
прямо под последним, например:
useEffect(() => {
setTimeout(() => clearInterval(interval.current), 15000)
}, [])
Предупреждение исчезнет, но обратный отсчет больше не будет работать. Так как мне сделать это правильно, чтобы не влиять на обратный отсчет и очистить предупреждение?