Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Bruk av Context i et Reelt Scenario | React Hooks og Context for Tilstandshåndtering
React Mastery

bookBruk av Context i et Reelt Scenario

La oss lage en bloggkilde om planetene. Vi skal bruke Context for å unngå prop drilling. Appen vil bestå av følgende komponenter: App, Filter, PlanetList og PlanetItem. For å visualisere hierarkiet, vennligst se bildet nedenfor.

Steg 1

Opprett Context i filen context.js på øverste nivå.

import { createContext } from "react";

const Context = createContext();

export default Context;

Steg 2

Gjør hele appen oppmerksom på at vi bruker context. Derfor må vi pakke hele appen inn i Context.Provider i filen App.jsx.

import React from "react";
import Context from "../context";
import Filter from "../Filter/Filter";
import PlanetList from "../PlanetList/PlanetList";

const App = () => {
  return (
    <Context.Provider>
      <div>
        <Filter />
        <PlanetList />
      </div>
    </Context.Provider>
  );
};

export default App;

Steg 3

I dette steget må vi sette kontekstens data (value-prop for Context.Provider-komponenten). La oss begynne med å rendre noen data. Dataene presenteres som et array av objekter:

const planetData = [
  {
    id: "3a6d44da-bbe2-4ac2-a622-7ca5f321b71c",
    name: "Mercury",
    weight: "3.3011 × 10^23 kg",
    size: "4,879 km",
    distanceFromSun: "57.9 million km",
    material: "Rocky",
    image:
      "https://codefinity-content-media.s3.eu-west-1.amazonaws.com/code-1/react/react-hooks-%26-context/mercury.png",
    existenceYears: "4.5 billion years",
  },
... 
  {...}
];

Dette skal vi gjøre:

Importer data fra data.js-filen

import data from "../data";

Initialiser state for planets som et tomt array ved bruk av useState-hooken.

import React, { useState } from "react";
// ...
const [planets, setPlanets] = useState([]);

Bruk useEffect-hooken for å tildele de importerte dataene til planets-variabelen. Dette sikrer at vi har data å rendre.

import React, { useState, useEffect } from "react";
// ...
  useEffect(() => {
    setPlanets(data);
  }, []);

Opprett variabelen appData, som representerer alle appens data, og som vil være et objekt med planets-state.

const appData = { planets };

Tildel appData-variabelen til value-propen til context provider.

return (
  <Context.Provider value={appData}>
    <div>
      <Filter />
      <PlanetList />
    </div>
  </Context.Provider>
);

Full kode for App.jsx-filen etter steg tre.

import React, { useEffect, useState } from "react";
import Context from "../context";
import data from "../data";
import Filter from "../Filter/Filter";
import PlanetList from "../PlanetList/PlanetList";

const App = () => {
  const [planets, setPlanets] = useState([]);

  useEffect(() => {
    setPlanets(data);
  }, []);

  const appData = { planets };

  return (
    <Context.Provider value={appData}>
      <div>
        <Filter />
        <PlanetList />
      </div>
    </Context.Provider>
  );
};

export default App;

Steg 4

La oss se nærmere på PlanetList-komponenten. Hensikten er å rendre en spesifikk markup. Inne i denne markuppen bruker vi PlanetItem-komponenten. Det er verdt å merke seg at vi ikke sender noen props eller bruker context i denne komponenten, siden det ikke er behov for å jobbe med data på dette nivået.

import React from "react";
import PlanetItem from "../PlanetItem/PlanetItem";

const PlanetList = () => {
  return (
    <ul>
      <PlanetItem />
    </ul>
  );
};

export default PlanetList;

Steg 5

I dette steget må vi få tilgang til dataene for å rendre informasjon om planetene. For å gjøre dette følger vi disse stegene:

Importer Context fra context.js-filen.

import Context from "../context";

Bruk useContext-hooken for å hente planets-dataene fra context.

import React, { useContext } from "react";
// ...
const { planets } = useContext(Context);

Rendre markup ved å bruke map-funksjonen, som lar oss iterere over datasettet i React. Bruk destrukturering for å få tilgang til alle egenskapene til hvert planet-objekt.

return (
  <>
    {planets.map(
      ({
        id,
        name,
        weight,
        size,
        distanceFromSun,
        material,
        image,
        existenceYears,
      }) => (
        <li key={id}>
          <img src={image} alt={name} width={160} />
          <div>
            <h3>{name}</h3>
            <p>
              Weight: <span>{weight}</span>
            </p>
            <p>
              Size: <span>{size}</span>
            </p>
            <p>
              Distance form Sun: <span>{distanceFromSun}</span>
            </p>
            <p>
              Material: <span>{material}</span>
            </p>
            <p>
              Old: <span>{existenceYears}</span>
            </p>
          </div>
        </li>
      )
    )}
  </>
);

Full kode for PlanetItem.jsx-filen etter steg fem.

import React, { useContext } from "react";
import Context from "../context";

const PlanetItem = () => {
  const { planets } = useContext(Context);

  return (
    <>
      {planets.map(
        ({
          id,
          name,
          weight,
          size,
          distanceFromSun,
          material,
          image,
          existenceYears,
        }) => (
          <li key={id}>
            <img src={image} alt={name} width={160} />
            <div>
              <h3>{name}</h3>
              <p>
                Weight: <span>{weight}</span>
              </p>
              <p>
                Size: <span>{size}</span>
              </p>
              <p>
                Distance form Sun: <span>{distanceFromSun}</span>
              </p>
              <p>
                Material: <span>{material}</span>
              </p>
              <p>
                Old: <span>{existenceYears}</span>
              </p>
            </div>
          </li>
        )
      )}
    </>
  );
};

export default PlanetItem;

Full app-kode:

Ta gjerne en gjennomgang av hele prosjektet, med fokus på funksjonalitet og struktur. For øyeblikket anbefales det å konsentrere seg om hvordan data sendes og vises i de ulike komponentene. Legg merke til hvordan data hentes og brukes i barnekomponentene, med unntak av Filter-komponenten. Filter-komponenten vil være en utfordring i neste kapittel, slik at du kan videreutvikle appens funksjonalitet.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 11

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Suggested prompts:

Can you explain how the Context API helps avoid prop drilling in this app?

What is the next step for implementing the Filter component?

Could you summarize the main responsibilities of each component in this project?

Awesome!

Completion rate improved to 2.17

bookBruk av Context i et Reelt Scenario

Sveip for å vise menyen

La oss lage en bloggkilde om planetene. Vi skal bruke Context for å unngå prop drilling. Appen vil bestå av følgende komponenter: App, Filter, PlanetList og PlanetItem. For å visualisere hierarkiet, vennligst se bildet nedenfor.

Steg 1

Opprett Context i filen context.js på øverste nivå.

import { createContext } from "react";

const Context = createContext();

export default Context;

Steg 2

Gjør hele appen oppmerksom på at vi bruker context. Derfor må vi pakke hele appen inn i Context.Provider i filen App.jsx.

import React from "react";
import Context from "../context";
import Filter from "../Filter/Filter";
import PlanetList from "../PlanetList/PlanetList";

const App = () => {
  return (
    <Context.Provider>
      <div>
        <Filter />
        <PlanetList />
      </div>
    </Context.Provider>
  );
};

export default App;

Steg 3

I dette steget må vi sette kontekstens data (value-prop for Context.Provider-komponenten). La oss begynne med å rendre noen data. Dataene presenteres som et array av objekter:

const planetData = [
  {
    id: "3a6d44da-bbe2-4ac2-a622-7ca5f321b71c",
    name: "Mercury",
    weight: "3.3011 × 10^23 kg",
    size: "4,879 km",
    distanceFromSun: "57.9 million km",
    material: "Rocky",
    image:
      "https://codefinity-content-media.s3.eu-west-1.amazonaws.com/code-1/react/react-hooks-%26-context/mercury.png",
    existenceYears: "4.5 billion years",
  },
... 
  {...}
];

Dette skal vi gjøre:

Importer data fra data.js-filen

import data from "../data";

Initialiser state for planets som et tomt array ved bruk av useState-hooken.

import React, { useState } from "react";
// ...
const [planets, setPlanets] = useState([]);

Bruk useEffect-hooken for å tildele de importerte dataene til planets-variabelen. Dette sikrer at vi har data å rendre.

import React, { useState, useEffect } from "react";
// ...
  useEffect(() => {
    setPlanets(data);
  }, []);

Opprett variabelen appData, som representerer alle appens data, og som vil være et objekt med planets-state.

const appData = { planets };

Tildel appData-variabelen til value-propen til context provider.

return (
  <Context.Provider value={appData}>
    <div>
      <Filter />
      <PlanetList />
    </div>
  </Context.Provider>
);

Full kode for App.jsx-filen etter steg tre.

import React, { useEffect, useState } from "react";
import Context from "../context";
import data from "../data";
import Filter from "../Filter/Filter";
import PlanetList from "../PlanetList/PlanetList";

const App = () => {
  const [planets, setPlanets] = useState([]);

  useEffect(() => {
    setPlanets(data);
  }, []);

  const appData = { planets };

  return (
    <Context.Provider value={appData}>
      <div>
        <Filter />
        <PlanetList />
      </div>
    </Context.Provider>
  );
};

export default App;

Steg 4

La oss se nærmere på PlanetList-komponenten. Hensikten er å rendre en spesifikk markup. Inne i denne markuppen bruker vi PlanetItem-komponenten. Det er verdt å merke seg at vi ikke sender noen props eller bruker context i denne komponenten, siden det ikke er behov for å jobbe med data på dette nivået.

import React from "react";
import PlanetItem from "../PlanetItem/PlanetItem";

const PlanetList = () => {
  return (
    <ul>
      <PlanetItem />
    </ul>
  );
};

export default PlanetList;

Steg 5

I dette steget må vi få tilgang til dataene for å rendre informasjon om planetene. For å gjøre dette følger vi disse stegene:

Importer Context fra context.js-filen.

import Context from "../context";

Bruk useContext-hooken for å hente planets-dataene fra context.

import React, { useContext } from "react";
// ...
const { planets } = useContext(Context);

Rendre markup ved å bruke map-funksjonen, som lar oss iterere over datasettet i React. Bruk destrukturering for å få tilgang til alle egenskapene til hvert planet-objekt.

return (
  <>
    {planets.map(
      ({
        id,
        name,
        weight,
        size,
        distanceFromSun,
        material,
        image,
        existenceYears,
      }) => (
        <li key={id}>
          <img src={image} alt={name} width={160} />
          <div>
            <h3>{name}</h3>
            <p>
              Weight: <span>{weight}</span>
            </p>
            <p>
              Size: <span>{size}</span>
            </p>
            <p>
              Distance form Sun: <span>{distanceFromSun}</span>
            </p>
            <p>
              Material: <span>{material}</span>
            </p>
            <p>
              Old: <span>{existenceYears}</span>
            </p>
          </div>
        </li>
      )
    )}
  </>
);

Full kode for PlanetItem.jsx-filen etter steg fem.

import React, { useContext } from "react";
import Context from "../context";

const PlanetItem = () => {
  const { planets } = useContext(Context);

  return (
    <>
      {planets.map(
        ({
          id,
          name,
          weight,
          size,
          distanceFromSun,
          material,
          image,
          existenceYears,
        }) => (
          <li key={id}>
            <img src={image} alt={name} width={160} />
            <div>
              <h3>{name}</h3>
              <p>
                Weight: <span>{weight}</span>
              </p>
              <p>
                Size: <span>{size}</span>
              </p>
              <p>
                Distance form Sun: <span>{distanceFromSun}</span>
              </p>
              <p>
                Material: <span>{material}</span>
              </p>
              <p>
                Old: <span>{existenceYears}</span>
              </p>
            </div>
          </li>
        )
      )}
    </>
  );
};

export default PlanetItem;

Full app-kode:

Ta gjerne en gjennomgang av hele prosjektet, med fokus på funksjonalitet og struktur. For øyeblikket anbefales det å konsentrere seg om hvordan data sendes og vises i de ulike komponentene. Legg merke til hvordan data hentes og brukes i barnekomponentene, med unntak av Filter-komponenten. Filter-komponenten vil være en utfordring i neste kapittel, slik at du kan videreutvikle appens funksjonalitet.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 11
some-alt