Внедряването на тъмна/светла тема или многотематична функция, подобно на това, което предлага Twitter, е една от основните функции на всяко малко/средно/голямо уеб/мобилно приложение в наши дни, защото по-голямата част от хората, които използват тези приложения, е много вероятно да имат цветови предпочитания и трябва да разработите приложението си по начин, който да може да задоволи техните нужди, за да създадете по-добро потребителско изживяване в цялото си приложение, независимо в мрежата или мобилни устройства.
TLDR;
Без повече шум, нека започнем с внедряването на тази функция в приложение на React, но забележете, че тази функция ще използва функции само за CSS и манипулиране на DOM, така че можете да я използвате във всяка рамка/библиотека или чисто HTML/CSS приложение.
1- Дефинирайте глобален CSS/SCSS/Styled-Component/CSS-In-JS файл, който контролира и представлява вашите глобални директиви за стил или система за проектиране.
В горното, както можете да видите, създадох глобален файл със стилове, използвайки суфикса SCSS и дефинирах основно правило вътре в него, дефинирайки моите цветове и шрифтове. Основно root е там, за да ви помогне да централизирате вашите променливи като цветове, размери, шрифтове , полета, подложки и др.
2- Създайте компонент за тема, за да управлявате вашата функционалност за превключване на тема, както е показано по-долу:
import { useState } from "react"; const Theme = () => { const [theme, setTheme] = useState("light"); const toggleTheme = () => { setTheme((prev) => { const newThemeValue = prev === "light" ? "dark" : "light"; // Add theme attribute with respective them value of the state document.body.setAttribute("theme", newThemeValue); return newThemeValue; }); }; return ( <div> <button onClick={toggleTheme}> {theme === "light" ? "dark" : "light"} </button> </div> ); }; export default Theme;
В горния код имаме компонент за тема с прост HTML бутон за превключване на нашата тема между тъмен и светъл режим, но можете да стилизирате това по ваш собствен начин, за да го направите по-елегантен!
Най-важната част тук е да зададете атрибут към тялото на вашия HTML документ, например тук добавям атрибут на тема и задавам стойността му на стойността на моята тема, за да мога да го насоча в моя CSS файл.
Забележка: не забравяйте, че това не изобразява отново цялото ви приложение в React, но това, което правите, е манипулиране на DOM директно в манипулатор на събитие на React, така че ако искате да получите достъп до стойността на темата в цялото си приложение, използвайте във вашите компоненти можете да използвате глобален контекст и да обвиете приложението си вътре в него за вашата тема, но тъй като това унищожава единствената цел на CSS на нашата работа, ние няма да го правим тук.
3- Добавете променливи за тъмна тема и насочете темата според вашия HTML атрибут body dark.
Сега дефинирайте CSS селектор въз основа на вашия HTML атрибут на тялото, в този случай, тъй като го нарекох „them“, ще избера [theme=”dark”] тук и ще дефинирам нови цветове за моите променливи.
Лесно грах, нали?
4- Мулти тема и как се променят стойностите на променливите?
Чрез горния подход можете да използвате множество стойности на темата или дори да я направите динамична, така че не само да имате тъмен и светъл режим, можете да създавате други типове като синьо или червено или т.н.
По принцип този подход работи по следния начин, вие дефинирате вашите променливи и цветове в основния си селектор, след това насочвате стойността на темата на тялото на HTML и променяте цвета на същите тези променливи, които сте дефинирали, CSS автоматично ще замени новите цветове във вашето приложение .
Бонус: Ако искате да запазите стойността на темата във вашето приложение, можете да я запишете в данните на потребителския профил във вашата база данни, но най-лесният подход тук е да съхраните стойността в локално хранилище.
Задавам елемента на темата в моето локално хранилище и всеки път, когато приложението ми се опреснява трудно или ако затворя сесията (раздела) и се върна отново, чета данни за темата от локалното хранилище.
import { useEffect, useState } from "react"; const Theme = () => { const [theme, setTheme] = useState("light"); useEffect(() => { const currentTheme = localStorage.getItem("theme"); if (currentTheme) { setTheme(currentTheme); document.body.setAttribute("theme", currentTheme); } }, []); const toggleTheme = () => { setTheme((prev) => { const newThemeValue = prev === "light" ? "dark" : "light"; // Add theme attribute with respective them value of the state document.body.setAttribute("theme", newThemeValue); // Persist the current theme value in localStorage localStorage.setItem("theme", newThemeValue); return newThemeValue; }); }; return ( <div> <button onClick={toggleTheme}> {theme === "light" ? "dark" : "light"} </button> </div> ); }; export default Theme;
Надявам се, че ви е харесало досега, така че, моля, не се колебайте да задавате вашите въпроси или подкрепа, ако ви е харесало.