Эта проблема с этим хуком заключается в том, что он не очищает elapsedTime
после завершения.
Вы можете решить эту проблему, добавив setTime(0)
к вам onFrame
функцию, когда ожидается, что анимация стоп.
Примерно так:
function onFrame() {
const newElapsed = Date.now() - start;
if (newElapsed >= duration) {
console.log('>>>> end with time', newElapsed)
setTime(0)
return;
}
setTime(newElapsed);
loop();
}
Я знаю, может показаться странным, что он не сбрасывается сам. Но имейте в виду, что ваша анимация использует один и тот же экземпляр хука как для уменьшения, так и для уменьшения. Поэтому эта очистка необходима.
Примечание: Я также переместил строку setTime(newElapsed)
, чтобы она шла после оператора if, поскольку в этом нет необходимости, если оператор if
true.
ОБНОВЛЕНИЕ:
Чтобы еще больше улучшить работу, вы можете переместить setTime(0)
к очистке return
.
This будет означать, что ваша onFrame
функция изменится на:
function onFrame() {
const newElapsed = Date.now() - start;
if (newElapsed >= duration) {
console.log('>>>> end with time', newElapsed)
setTime(0)
return;
}
setTime(newElapsed);
loop();
}
А затем обновите вашу return
очистку для useAnimationTimerOnDidUpdate
до:
return () => {
clearTimeout(timerStop);
clearTimeout(timerDelay);
cancelAnimationFrame(animationFrame);
setTime(0);
};
Я предполагаю, что причина, по которой ваша анимация "не работает должным образом", заключалась в том, что компонент будет иметь значение sh. Что касается моего тестирования, это обновление исправляет это.