Я борюсь с рендерингом компонента React в зависимости от результата условия. Чтобы быть более точным, я работаю над приложением «Будильник», где вы можете установить время, когда будильник должен «звонить».
Есть 3 функции, которые обновляются каждую секунду через useEffect () .
currentTime () - получает текущее время и вставляет в состояние
function currentTime(){
let time = new Date().toLocaleTimeString('it-IT');
let hours = time.substr(0,2);
let minutes = time.substr(3,2);
let seconds = time.substring(time.length-2)
setTime(prevState => ({
...prevState,
currentHour:hours,
currentMinute:minutes,
currentSecond:seconds
}))
}
currentDate () - получает текущую дату и вставляет в состояние
function currentDate(){
let date = new Date();
let day = days[date.getDay()];
setTime(prevState => ({
...prevState,
currentDay:day
}))
}
checkTime () - проверяет, если состояние alarmHours пустое или нет. Это состояние имеет значение, только если установлена тревога.
function checkTime(){
if(time.alarmHours && time.alarmMinutes){
if(time.currentHour === time.alarmHours && time.currentMinute === time.alarmMinutes &&
time.currentSecond === '00'){
setShowRing(true);
}
}
}
Чтобы установить тревогу, вам нужно нажать на кнопку SET ALARM , которая пока находится в правом верхнем углу. После щелчка появляется компонент Alarm. js, который исчезает, а когда вы закончите, исчезает. Эти переходы выполняются с использованием React Spring Transitions.
В этот Alarm. js компонент передается функция как опора из App. js . Эта функция должна получать всю заполненную информацию из Alarm. js (сообщение для будильника и время, когда должен прозвучать сигнал) и сохранять их в состоянии.
function getAlarm(){
let description = document.getElementById('text').value;
let hours = document.getElementById('hours').value;
let minutes = document.getElementById('minutes').value;
setTime(prevState => ({
...prevState,
message:description,
alarmHours:hours,
alarmMinutes:minutes,
}));
}
In В моем предыдущем вопросе я спрашивал, как вызвать этот компонент Ring, когда условие выполнено, и текущее время равно установленному времени. Мне сказали сделать это:
const [showRing,setShowRing] = useState(false);
Затем при выполнении условия checkTime
setShowRing(true);
И в приложении. js рендеринг:
{showRing && <Ring message={time.message} turnOff={()=>setShowRing(false)} />}
Это работает. Но без переходов и было бы лучше, если бы он был полностью отделен в собственном файле, как Alarm. js. Я пытался добавить к нему переходы, но потом он даже не отображался. Лучшим вариантом будет назвать его как Alarm. js в условии, и все эти переходы будут выполняться в собственном файле. Я имею в виду
function checkTime(){
if(time.alarmHours && time.alarmMinutes){
if(time.currentHour === time.alarmHours && time.currentMinute === time.alarmMinutes &&
time.currentSecond === '00'){
return <Ring />
}
}
}
Но это не работает. Даже если я попытаюсь добавить к нему эти переходы в Ring. js. Кто-нибудь может мне с этим помочь, пожалуйста? Я был бы очень признателен.
CODESANDBOX здесь .