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 installfor å installere alle dependencies. -
Lag en ny fil
CounterButton.tsxog 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
interfacesom sier hvilke propsCounterButtonhar:
interface Props {
count: number;
onClick: () => void;
}-
Knytt det nye prop-interfacet til komponenten ved å endre
React.FCtilReact.FC<Props>. -
Ta imot de nye propsene som argumenter:
export const CounterButton: React.FC<Props> = ({count, onClick}) => {- Kall
onClickfunksjonen 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.tsfor å 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
valuepropen som er påkrevd påCounterContext.Providerelementet. Her vil vi da gi en referanse tilcountstaten vi har, samt funksjonen vi allerede har for å øke count:
<CounterContext.Provider value={{ count: count, onChange: increaseCount }}>-
Fjern propsene
countogonClickfraCounterButtonelementet iApp.tsx. -
Bruk
useContexthooken iCounterButton.tsxfor å 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}>