Denne workshopen består av flere oppgaver. De første oppgavene er de enkleste, men også de viktigste å mestre. Mye av koden som trengs for å klare oppgavene gis i starten, men dette blir det mindre av etterhvert i de senere oppgavene. Det er også oppfordret å prøve å løse oppgavene uten å se på kode-snuttene.
I denne oppgaven skal vi lage en CounterButton
komponent, som skal brukes i App.tsx
som har props for å lese og sette count. App.tsx
skal da opptre som en container-komponent, og CounterButton
komponenten opptrer som en state-less komponent.
-
Kjør
npm install
for å installere alle dependencies. -
Lag en ny fil
CounterButton.tsx
og fyll inn boilerplaten for en ny React-komponent:
import React from "react";
export const CounterButton: React.FC = () => {
return <button>The count is {count}</button>;
};
- Lag et
interface
som sier hvilke propsCounterButton
har:
interface Props {
count: number;
onClick: () => void;
}
-
Knytt det nye prop-interfacet til komponenten ved å endre
React.FC
tilReact.FC<Props>
. -
Ta imot de nye propsene som argumenter:
export const CounterButton: React.FC<Props> = ({count, onClick}) => {
- Kall
onClick
funksjonen som kommer inn som en prop når brukeren klikker på knappen:
<button onClick={onClick}>The count is {count}</button>
- Bruk den nye komponenten i
App.tsx
:
<CounterButton count={count} onClick={increaseCount} />
<CounterButton count={count} onClick={increaseCount} />
Denne oppgaven baserer seg på samme mål som i oppgave 1, men hvor vi heller skal bruke useContext
for å holde på og distribuere state. Dette er et alternativt pattern til props og kan være en fin måte å administrate state når komponent-treet og/eller staten begynner å bli kompleks.
- Lag en ny fil
CounterContext.ts
for å holde på konteksten:
import { createContext } from "react";
interface CounterState {
count: number;
onChange: () => void;
}
export const CounterContext = createContext<CounterState>({
count: 0,
onChange: () => {},
});
-
Bruk den nye contexten i
App.tsx
. Gjør dette ved å erstatte fragment-elementet (<>
) som wrapper innholdet med<CounterContext.Provider>
elementet. -
Fyll ut
value
propen som er påkrevd påCounterContext.Provider
elementet. Her vil vi da gi en referanse tilcount
staten vi har, samt funksjonen vi allerede har for å øke count:
<CounterContext.Provider value={{ count: count, onChange: increaseCount }}>
-
Fjern propsene
count
ogonClick
fraCounterButton
elementet iApp.tsx
. -
Bruk
useContext
hooken iCounterButton.tsx
for å hente counter contexten:
const { count, onChange } = useContext(CounterContext);
I denne oppgaven ønsker vi å øve på å style en React komponent, ved hjelp av CSS-moduler. Dette scoper CSSen til å kun fungere innenfor en komponent, og vil dermed forhindre at CSS ligger globalt i applikasjonen.
-
Legg til en ny css fil for
CounterButton
, kaltCounterButton.module.css
. -
Fyll inn CSS for knappen:
.counterButton {
border-radius: 8px;
border: 1px solid var(--computas-primary);
padding: 0.6rem 1.2rem;
font-size: 1rem;
font-family: inherit;
background-color: var(--computas-white);
color: var(--computas-primary);
cursor: pointer;
transition: all 0.2s;
}
.counterButton:hover {
background-color: var(--computas-primary);
color: var(--computas-white);
}
- Importer den nye CSS-filen i
CounterButton.tsx
:
import styling from "./CounterButton.module.css";
- Bruk denne stylingen på knappen:
<button onClick={onChange} className={styling.counterButton}>