Det har blitt populært for programmer å ha en innstilling som lar deg veksle mellom mørk og lys modus. Kanskje det er på grunn av populariteten til mørke brukergrensesnitt, kanskje det er fordi apper gradvis blir mer konfigurerbare.

React-kontekst er en enkel måte å dele data globalt på, men det kan gjøre gjenbruk av komponenter vanskeligere. Som et alternativ kan du bygge en mørk modus-knappkomponent som bruker useEffect- og useState-krokene i stedet for kontekst. Det vil bytte et dataattributt på body-elementet som CSS-stiler kan målrettes mot.

Hva du trenger

For å følge med på denne opplæringen, trenger du følgende:

  • En nylig versjon av Node installert på maskinen din.
  • En grunnleggende forståelse av React og Reager kroker.
  • Et starter React-prosjekt. Bare lage en React-app og du er klar til å gå.

Lag en knappekomponent

Knappekomponenten vil være ansvarlig for å bytte tema fra mørkt til lyst. I et ekte program kan denne knappen være en del av Navbar-komponenten.

Opprett en ny fil kalt Button.js i src-mappen og legg til følgende kode.

import { useState } fra 'reagere'

eksportmisligholdefunksjonKnapp() {
const [tema, settheme] = brukState("mørk")

konst handleToggle = () => {
const newTheme = tema "lys"? "mørk": "lys"
settheme (nytt tema)
}
komme tilbake (
<>
<knappen klassenavn="temaBtn" onClick={handleToggle}>
{tema "lys"? <span>mørk</span>: <span>lys</span>}
</button>
</>
)
}

Først importerer du useState()-kroken fra React. Du vil bruke den til å holde styr på gjeldende tema.

I Button-komponenten initialiserer du tilstanden til mørk. HandleToggle()-funksjonen vil ta seg av vekslingsfunksjonaliteten. Den kjører hver gang du klikker på knappen.

Denne komponenten bytter også på knappeteksten når den endrer tema.

For å vise Button-komponenten importerer du den til App.js.

import Knapp fra './Knapp';
funksjonApp() {
komme tilbake (
<div>
<Knapp/>
</div>
);
}

eksportmisligholde App;

Lag CSS-stiler

Akkurat nå endrer ikke brukergrensesnittet til React-appen å klikke på knappen. For det må du først lage CSS-stilene for mørk og lys modus.

I App.css legger du til følgende.

kropp {
--farge-tekst-primær: #131616;
--farge-tekst-sekundær: #ff6b00;
--farge-bg-primær: #E6EDEE;
--farge-bg-sekundær: #7d86881c;
bakgrunn: var(--farge-bg-primær);
farge: var(--farge-tekst-primær);
overgang: bakgrunn 0.25slette inn-ut;
}
body[data-tema="lys"] {
--farge-tekst-primær: #131616;
--farge-bg-primær: #E6EDEE;
}
body[data-tema="mørk"] {
--farge-tekst-primær: #F2F5F7;
--farge-bg-primær: #0E141B;
}

Her definerer du stilene til body-elementet ved hjelp av dataattributter. Det er lystemadataattributtet og mørkt temadataattributt. Hver av dem har CSS-variabler med forskjellige farger. Ved å bruke CSS-dataattributter kan du bytte stiler i henhold til dataene. Hvis en bruker velger et mørkt tema, kan du sette kroppsdataattributtet til mørkt og brukergrensesnittet endres.

Du kan også endre knappeelementstilene for å endre med temaet.

.themeBtn {
polstring: 10px;
farge: var(--farge-tekst-primær);
bakgrunn: gjennomsiktig;
grense: 1px solid var(--farge-tekst-primær);
markør: peker;
}

Endre knappekomponent for å veksle mellom stiler

For å veksle mellom stilene som er definert i CSS-filen, må du angi dataene i body-elementet i handleToggle()-funksjonen.

I Button.js, endre handleToggle() slik:

konst handleToggle = () => {
const newTheme = tema "lys"? "mørk": "lys"
settheme (nytt tema)
dokument.body.dataset.theme = tema
}

Hvis du klikker på knappen, skal bakgrunnen veksle fra mørk til lys eller lys til mørk. Men hvis du oppdaterer siden, tilbakestilles temaet. For å opprettholde temainnstillingen, lagre temapreferansen i lokal lagring.

Vedvarende brukerpreferanse i lokal lagring

Du bør hente brukerpreferansen så snart Button-komponenten gjengis. UseEffect()-kroken er perfekt for dette siden den kjører etter hver gjengivelse.

Før du henter temaet fra den lokale lagringen, må du lagre det først.

Opprett en ny funksjon kalt storeUserPreference() i Button.js.

konst storeUserSetPreference = (pref) => {
localStorage.setItem("tema", pref);
};

Denne funksjonen mottar brukerpreferansen som et argument og lagrer den som et element kalt tema.

Du vil kalle denne funksjonen hver gang brukeren bytter tema. Så, endre handleToggle()-funksjonen til å se slik ut:

konst handleToggle = () => {
const newTheme = tema "lys"? "mørk": "lys"
settheme (nytt tema)
storeUserSetPreference (nytt tema)
dokument.body.dataset.theme = tema
}

Følgende funksjon henter temaet fra lokal lagring:

konst getUserSetPreference = () => {
returner localStorage.getItem("tema");
};

Du vil bruke den i useEffect-kroken, så hver gang komponenten renderes, henter den preferansen fra lokal lagring for å oppdatere temaet.

useEffect(() => {
konst userSetPreference = getUserSetPreference();

if (userSetPreference) {
settheme (userSetPreference)
}
dokument.body.dataset.theme = tema
}, [tema])

Få brukerpreferanser fra nettleserinnstillinger

For en enda bedre brukeropplevelse kan du bruke foretrekker-fargeskjema CSS-mediefunksjon for å angi temaet. Dette bør gjenspeile en brukers systeminnstillinger som de kan kontrollere via operativsystemet eller nettleseren. Innstillingen kan enten være lys eller mørk. I applikasjonen din må du sjekke denne innstillingen umiddelbart etter at knappekomponenten er lastet inn. Dette betyr å implementere denne funksjonaliteten i useEffect()-kroken.

Lag først en funksjon som henter brukerpreferansen.

I Button.js legger du til følgende.

konst getMediaQueryPreference = () => {
const mediaQuery = "(foretrekker-fargeskjema: mørk)";
konst mql = vindu.matchMedia (mediaQuery);
konst hasPreference = type mql.matches "boolean";

if (hasPreference) {
returnere mql.matches? "mørk": "lys";
}
};

Deretter endrer du useEffect()-kroken for å hente mediespørringspreferansen og bruk den hvis det ikke er angitt noe tema i den lokale lagringen.

useEffect(() => {
konst userSetPreference = getUserSetPreference();
konst mediaQueryPreference = getMediaQueryPreference();

if (userSetPreference) {
settheme (userSetPreference)
} ellers {
settheme (mediaQueryPreference)
}

dokument.body.dataset.theme = tema
}, [tema])

Hvis du starter programmet på nytt, bør temaet samsvare med systemets innstillinger.

Bruke React Context for å veksle mellom mørk modus

Du kan bruke dataattributter, CSS og React-kroker for å bytte tema for en React-applikasjon.

En annen tilnærming til å håndtere mørk modus i React er å bruke kontekst-API. React-kontekst lar deg dele data på tvers av komponenter uten å måtte sende det ned gjennom rekvisitter. Når du bruker den til å veksle mellom temaer, oppretter du en temakontekst som du har tilgang til i hele applikasjonen. Du kan deretter bruke temaverdien til å bruke matchende stiler.

Selv om denne tilnærmingen fungerer, er det enklere å bruke CSS-dataattributter.