создайте таймер с помощью реактивных крючков

#reactjs #timer #react-hooks #use-effect

#reactjs #таймер #реагирующие перехваты #использование-эффект

Вопрос:

Я собираюсь создать таймер обратного отсчета на своем веб-сайте. мое время окончания приходит с сервера (это число, подобное этому: 10500 (что означает, что до завершения таймера осталось 10500 минут))

я не могу этого сделать, есть ли кто-нибудь, кто может мне помочь?

 const [times, setTimes] = useState({ days: 0, hours: 0, minutes: 0, seconds: 0 });
const [timeToReserve, setTimeToReserve] = useState(props.reserveData.ToReserve);

React.useEffect(() => {
    timeToReserve > 0 amp;amp; setTimeout(() => checkTime(), 1000);
}, [timeToReserve]);

const checkTime = () => {
    let minutesToReserve = timeToReserve - 1
    setTimeToReserve(minutesToReserve)

    let days = Math.floor(minutesToReserve / (1000 * 60 * 60 * 24));
    let hours = Math.floor((minutesToReserve % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
    let minutes = Math.floor((minutesToReserve % (1000 * 60 * 60)) / (1000 * 60));
    let seconds = Math.floor((minutesToReserve % (1000 * 60)) / 1000);

    setTimes({ days, hours, minutes, seconds })
}
  

Ответ №1:

Что-то вроде этого должно сработать:

 import React, {useState, useEffect} from 'react';

const CountDown = ({ reserveData }) => {
    const [secondsLeft, setSecondsLeft] = useState(reserveData.ToReserve * 60);
    
    useEffect(() => {
        const countDownTimeout = setTimeout(() => {
            // Stop in case the time is over
            if (secondsLeft > 0) {
                return setSecondsLeft(seconds => seconds - 1);
            }
            clearTimeout(countDownTimeout);
        }, 1000);
        
        // Clean up if unmounted
        return () => clearTimeout(countDownTimeout);
    }, [secondsLeft]);
    
    const days = Math.floor(secondsLeft / (60 * 60 * 24));
    const hours = Math.floor((secondsLeft % (60 * 60 * 24)) / (60 * 60));
    const minutes = Math.floor((secondsLeft % (60 * 60)) / 60);
    const seconds = Math.floor(secondsLeft % 60);
    return (
        <p>
            {days} days, {hours}:{minutes}:{seconds}
        </p>
    );
};

export default CountDown;
  

Вы могли бы использовать этот компонент как:

 <CountDown
    reserveData={{ToReserve: 24 * 6 * 60}}
/>