Как поменять background-image через React-код в зависимости от условия if-else?

Хочу менять background-image в блоке <div> в зависимости от условия.
Использовал useRef для привязки к блоку ref, но через него не удаётся и не добавляется стиль CSS. Возможно, это из-за не работающего пути к изображению, которое находится в папке public, хотя, вроде как, всё должно работать. Может кто-то знает или делал подобный функционал?

const { useState, useRef, useEffect } = React;

function Welcome() {
  const [interval, setInterval] = useState(null);
  const timeRef = useRef(null);

  useEffect(() => {
    const time = new Date();
    if (time.getHours() >= 6 && time.getHours() < 12) {
      setInterval("1");
      welcomeRef.current.style.backgroundImage = "/assets/img/morning.jpg";
    } else if (time.getHours() >= 12 && time.getHours() < 18) {
      setInterval("2");
      welcomeRef.current.style.backgroundImage = "/assets/img/morning.jpg";
    } else if (time.getHours() >= 18) {
      setInterval("3");
      welcomeRef.current.style.backgroundImage = "/assets/img/morning.jpg";
    }
  });

  return (
    <section className="welcome" ref={timeRef}>
      <div className="time__wrapper">
        <div className="time__text">
          <h1 className="time__heading">Сейчас: {interval}!</h1>
        </div>
      </div>
    </section>
  );
}

ReactDOM.createRoot(document.getElementById("root")).render(
  <Welcome />
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.3.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.3.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>


Ответы (1 шт):

Автор решения: De.Minov

Не вижу никакого смысла использовать тут useRef, useState и useEffect.
По крайней мере, если не планируется динамическое изменение стейта по времени.

Создаём костанту с самовыполняющейся функцией, в ней делаем проверку на время, и как мне показалось, нужно вернуть массив значений - ['название изображения', 'название времени суток'].
После чего для определённого элемента добавляем атрибут style, для изображения выставляем backgroundImage: `url(/assets/img/${timeOfDay[0]}.jpg)` , чтобы выставить фоновое изображение.
И в текст добавляем Сейчас: { timeOfDay[1] }, чтобы получить "Сейчас: ночь!", например.

function Welcome() {
  const timeOfDay = (() => {
    const hour = new Date().getHours();
    
    // Давно писал похожее и искал инфу когда какое время суток, это типа верные данные :)
    if(hour >= 0 && hour < 4)    return ['https://i.imgur.com/LnI7p4u.png', 'ночь'];
    if(hour >= 4 && hour < 12)   return ['https://i.imgur.com/H6gc4zR.png', 'утро'];
    if(hour >= 12 && hour < 17)  return ['https://i.imgur.com/NqppFbp.png', 'день'];
    if(hour >= 17 && hour <= 23) return ['https://i.imgur.com/s8bzLmk.png', 'вечер'];
  })();

  return (
    <section
      className="welcome"
      style={ {
        backgroundImage: `url(${timeOfDay[0]})`
      } }
    >
      <div className="time__wrapper">
        <div className="time__text">
          <h1 className="time__heading">Сейчас: {timeOfDay[1]}!</h1>
        </div>
      </div>
    </section>
  );
}

ReactDOM.createRoot(document.getElementById("root")).render(
  <Welcome />
);
body {display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;}

.welcome {
  display: flex;
  justify-content: center;
  align-items: flex-start;
  width: calc(100vh - 20px);
  height: auto;
  aspect-ratio: 1;
  max-width: 300px;
  background-repeat: no-repeat;
  background-size: cover;
  background-position: center center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.3.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.3.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>

→ Ссылка