@historydev
Острая аллергия на анимешников

Как обновлять состояние по таймеру?

Здравствуйте. Скажите пожалуйста, как я могу обновлять состояние раз в секунду? Я создал счётчик времени и мне нужно выводить его в компонент реакта, я пробую это таким образом:

const date = {
    hours: 0,
    minutes: 0,
    seconds: 0,
    isActive: false,
    start: function() {
      this.isActive = true;
      return this
    },
    stop: function() {
      this.isActive = false;
      return this
    }
  }

  function timer() {

    if(this.isActive) {
      if(this.seconds < 60) date.seconds += 1;
      else {
        this.seconds = 0;
        if(this.minutes < 60) date.minutes += 1;
        else {
          this.minutes = 0;
          this.hours += 1;
        }
      }
    }

    return this

  }

  const myTimer = timer.bind(date);
  const [timerState, setTimerState] = useState({});
  let interval;

  useEffect(() => {
    if(interval) clearInterval(interval);
    interval = setInterval(() => {
      if(clients.length > 1) {
          setTimerState(myTimer().start());
      } else {
        setTimerState(myTimer().stop());
      }
      console.log(timerState);
    }, 1000);
  }, [clients, timerState]);


Но обновляется он криво и очень много спама, как я могу это реализовать?
Спасибо.
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ответы на вопрос 1
kosolapus
@kosolapus
Если помогло - отмечайте решением
Если нужно точное время - то это не лучшая идея. setInterval и setTimeout имеют лаги, которые начнут проявляться на дистанции.
Самый простой таймер это "текущее время - время запуска таймера". Таким образом, хранить надо не текущее положение счетчика, а время начала отсчета. А вот отрисовывать его да, по интервалу.

т.е.:
const startTime = newDate().now()
setinterval(()=>{
formatTimeToYourNeeds(new Date().now() - startTime)
}, 1000)


При таком раскладе вы не только получаете точный таймер, но и возможность изменять его, например выводить с точностью нужной точностью и интервалом
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы