Не работает изменение темы React + scss. Функция вызывается два раза подряд

Рейтинг: 0Ответов: 1Опубликовано: 06.08.2023

Делаю изменение темы на React + scss. При клике на переключатель темы функция отрабатывает два раза.

Есть useState - который хранит состояние темы. Есть useEffect - который меняет переменные root. Есть функция toggleTheme - в которой меняется setTheme.

Проблема при клике на переключатель, функция toggleTheme и useEffect отрабатывают два раза.

Что было предпринято ссылка на похожий вопрос - убирал React.StrictMode и использовал старый render + собирал проект и выкладывал в "прод" на github pages. Проблема не была решена ни в одном из случаев.

index.jsx

import React from "react";
import { createRoot } from "react-dom/client";
import { HashRouter } from "react-router-dom";
import "./index.scss";
import "./assests/css/theme.css";
import { App } from "./components/App";

createRoot(document.getElementById("root")).render(
  <React.StrictMode>
    <HashRouter>
      <App />
    </HashRouter>
  </React.StrictMode>
);

компонент ButtonTheme.jsx - в котором описана логика переключения темы. Компонент подключается в header и в мобильном меню при медиа запросе.

import s from "./ButtonTheme.module.scss";
import cn from "classnames";
import React from "react";
import { useState, useEffect } from "react";

const ButtonTheme = () => {
  const [theme, setTheme] = useState("light"); // state темы

  // функция для смены темы
  const toggleTheme = () => {
    setTheme(theme === "light" ? "dark" : "light"); // меняем state
  };

  useEffect(() => {
    const backgroundColor = `var(--background-color-${theme})`;

    document.body.style.setProperty("--background-color", backgroundColor);
  }, [theme]);

  return (
    <div
      className={cn(s.theme, "button__animation d-fl")}
      onClick={toggleTheme}
    >
      <input
        type="checkbox"
        className={s.customCheckbox}
        id="theme"
        name="theme"
        value="yes"
      ></input>
      <label htmlFor="theme"></label>
    </div>
  );
};

export { ButtonTheme };

Ответы

▲ 0Принят

Задача решена. Ответ в комментариях от @Oliver Patterson. Изменил событие с onClick на onChange - всё работает

<div
  className={cn(s.theme, "button__animation d-fl")}
  onChange={toggleTheme}
>