Есть много способов сделать это, но я покажу вам простой способ получить темный режим (ночной режим) для вашего веб-приложения или веб-сайта.

давайте начнем с простого приложения React с заголовком и основным разделом. Добавьте обработчик события onClick к кнопке-переключателю и передайте имя функции-переключателя. Я стилизовал заголовок с логотипом реакции и кнопкой, ничего сложного.

<div className="App">
  <header className="App-header">
    <img src={logo} className="App-logo" alt="logo" />
    <div onClick={darkModeToggle} className="toggle">
      <div className="toggle-switch"></div>
    </div>
  </header>
  <main className="App-main">
    <h1>Hello World</h1>
  </main>
</div>

Добавьте переход: 0,3 с во внутренний элемент div кнопки-переключателя, чтобы увеличить время анимации переключения.

.App-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  background: rgba(0 0 0 /0.1);
}
.toggle{
  width: 3.5em;
  height: 2em;
  border-radius: 2em;
  background: rgba(0 0 0 /0.2);
  margin-right: 1.5em;
  padding: 0.25em;
}
.toggle-switch{
  width: 1.5em;
  height: 1.5em;
  border-radius: 2em;
  background: #61dafb;
  transition: 0.3s;
}

Теперь есть 2 способа добавить стиль темного цвета: вы либо создаете класс с цветом, необходимым для темного режима, либо, если вы используете переменные CSS для своих цветов, вы можете их изменить. Давайте попробуем оба способа.

Нам нужно переместить круг внутри кнопки-переключателя, чтобы показать, что кнопка нажата. Создайте класс стиля CSS с необходимой анимацией при нажатии кнопки.

.switch-on{
  transition: 0.3s;
  transform: translateX(1.5em);
}

Создайте функцию переключения темного режима, используемую в обработчике onClick кнопки переключения.

function darkModeToggle(){
  const btn = document.querySelector('.toggle-switch')
  btn.classList.toggle('switch-on')
}

Теперь кнопка будет перемещать свой синий кружок вправо при нажатии и возвращаться в исходное положение при втором нажатии.

Затем создайте цветовую тему темного режима, которую вы хотите добавить к элементам DOM. Выберите темный цвет фона и яркий цвет текста.

.dark{
  background-color: #282c34;
  color: white;
}

Добавьте класс dark к элементам DOM, цветовую тему которых вы хотите изменить на темный режим. Я добавляю класс dark в body, потому что у меня нет других разделов с фоном набор цветов, и это простое приложение.

function darkModeToggle(){
  const btn = document.querySelector('.toggle-switch')
  const body = document.querySelector('body')
  btn.classList.toggle('switch-on')
  body.classList.toggle('dark')
}

Но это станет трудным, если в вашем приложении больше компонентов, выбор каждого элемента DOM и использование класса .toggle() требует много работы. Таким образом, самый простой способ — использовать переменные CSS для всех цветов и изменить переменные в функции переключения.

:root{
  --bg: white;
  --text: #101010;
  --secondary: #61dafb;
}

Теперь мы можем использовать эти переменные для использования цветов.

body{
  background: var(--bg);
  color: var(--text);
}

Поэтому, если мы изменим корневые переменные, это повлияет везде, где используется переменная. Во-первых, нам нужно выбрать :root для изменения переменных.

const root = document.querySelector(':root')

И мы можем использовать .style.setProperty(имя переменной, цветовой код), чтобы изменить цвета.

root.style.setProperty('--bg', '#282c34')
root.style.setProperty('--text', 'white')

Но теперь мы не используем метод .toggle(), поэтому нам нужно вернуть исходный цвет при втором щелчке. Мы можем использовать переменную для хранения состояния и изменять состояние при нажатии кнопки, чтобы мы могли использовать состояние в качестве контекста, чтобы проверить, находимся ли мы в темном режиме или нет. Таким образом, мы можем менять цвета в зависимости от состояния.

let state = false
function darkModeToggle(){
  const btn = document.querySelector('.toggle-switch')
  btn.classList.toggle('switch-on')
  state = !state
  if(state){
    root.style.setProperty('--bg', '#282c34')
    root.style.setProperty('--text', 'white')
  }else{
    root.style.setProperty('--bg', 'white')
    root.style.setProperty('--text', '#101010')
  }
}

Теперь это работает нормально, но мы можем сделать то же самое с хуками React useState и useEffect. Поэтому мы меняем состояние с помощью useState внутри функции переключения, а все остальное делаем внутри useEffect. Во-первых, давайте объявим useState.

const [state, setState] = React.useState(false)

Мы можем использовать функцию setState(), чтобы изменить значение внутри useState и получить доступ к значению, используя состояние . Лучше использовать функцию обратного вызова внутри setState(), если изменяемое значение связано/зависит от предыдущего значения, например: необходимо изменить состояниена true, если оно falseи наоборот.

function darkModeToggle(){
  const btn = document.querySelector('.toggle-switch')
  btn.classList.toggle('switch-on')
  setState(prevState => !prevState)
}

Чтобы правильно использовать useEffect, вам нужно передать состояние в виде массива зависимостей, чтобы useEffect не запускался при каждом рендеринге. С stateв качестве массива зависимостей useEffect отображается только в том случае, если изменяется state.

И все, теперь у вас есть темный режим. 👏

Пробуйте, настраивайте, делайте ошибки и делайте, что хотите. Хорошего дня и удачного кодирования.✌️