Причина его сбоя в том, что вы никогда не очищаете вызов setInterval. Таким образом, каждый раз, когда компонент повторно выполняет рендеринг (например, посредством вызова setuntilDeadline), эффект запускается снова. [] Указывает на то, что эффект должен запускаться только при монтировании, а затем очищаться при размонтировании (так как это пустой массив зависимостей).
Кроме того, вы должны очистить вызов setInterval независимо от массива зависимостей. чтобы убедиться в отсутствии утечек памяти и других проблем с производительностью.
useEffect(() => {
const intervalId = setInterval(() => {
const time =
Date.parse(untilDeadline.deadline) - Date.parse(new Date());
setuntilDeadline((prevValue) => {
return {
...prevValue,
seconds: Math.floor((time / 1000) % 60),
minutes: Math.floor((time / 1000 / 60) % 60),
hours: Math.floor((time / (1000 * 60 * 60)) % 24),
days: Math.floor(time / (1000 * 60 * 60 * 24)),
};
});
}, 1000);
return ()=>{
clearInterval(intervalId);
}
}, []);