Kontekstihook useContext Reactissa

Tässä oppitunnissa jatkamme kontekstin parissa. Nyt rakennamme komponenttipuun. Aluksi luomme erillisessä tiedostossa React-komponentin BigBox:

BigBox.jsxfunction BigBox() {
  return (
    <p>bigbox</p>
  );
}

Tuomme sen ja sijoittamme sen pääkomponenttiimme App:

App.jsximport BigBox from './BigBox';

function App() {
  return (
    <BigBox />
  );
}

Selvyyden vuoksi tyylitellään div-elementtejä hieman. Luomme tätä varten tiedoston styles.css:

styles.cssdiv {
  border: 1px solid blue;
  margin: 10px;
  text-align: center;
  max-width: 300px;
}

Emme unohda tuoda sitä App.js:ään:

App.jsximport './styles.css';

Nyt luomme erillisessä tiedostossa komponentin MiddleBox:

MiddleBox.jsxfunction MiddleBox() {
  return (
    <p>middlebox</p>
  );
}

Ja laitamme sen isoon laatikkoon BigBox:

BigBox.jsximport MiddleBox from './MiddleBox';

function BigBox() {
  return (
    <div>
      <MiddleBox />
    </div>
  );
}

Teemme saman pienen laatikon SmallBox kanssa:

SmallBox.jsxfunction SmallBox() {
  return (
    <p>Minä olen ... </p>
  );
}

Sijoittamme kaksi tällaista laatikkoa MiddleBox:iin:

MiddleBox.jsximport SmallBox from './SmallBox';

function MiddleBox() {
  return (
    <div>
      <SmallBox />
      <SmallBox />
    </div>
  );
}

Rakensimme puun. Ja nyt haluamme App:ltamme välittää, oletetaan, SmallBox:iin merkkijonon 'small box :)', käyttämättä proppeja, vaan hyödyntäen kontekstia (joskin laatikkosovelluksemme kasvaisi valtavaksi).

Kontekstitiedoston MyContext.js loimme ja yhdistimme edellisellä oppitunnilla.

Seuraava askel, jonka teemme - käärimme BigBox:in kontekstin tarjoajaan, joka on kontekstioliomme MyContext ominaisuus. Nyt kaikki tähän rakenteeseen suljetut komponentit (ja kaikki BigBox:iin sisäkkäin sijoitetut laatikot) voivat saada pääsyn ja tilata kontekstin muutoksiin. Kontekstin arvona välitämme toivotun 'small box :)':

App.jsxfunction App() {
  return (
    <MyContext.Provider value="small box :)">
      <BigBox />
    </MyContext.Provider>
  );
}

Ja nyt on vain luettava kontekstin arvo. Halusimme käyttää sitä SmallBox:ssa, joten tuomme sinne kontekstitiedoston MyContext.js ja hookin useContext:

SmallBox.jsximport { useContext } from 'react';
import { MyContext } from './MyContext.js';

Luemme useContext:n avulla kontekstin arvon muuttujaan name:

SmallBox.jsxfunction SmallBox() {
  const name = useContext(MyContext);
  
  return (
    <div>
      <p>Minä olen ... </p>
    </div>
  );
}

Tilasimme SmallBox:in tälle kontekstille ja, jos se muuttuu, tämä komponentti päivittyy myös.

Ja lopuksi, sijoittamme muuttujan name arvon ellipsin tilalle:

SmallBox.jsxfunction SmallBox() {
  const name = useContext(MyContext);
  
  return (
    <div>
      <p>Minä olen {name} </p>
    </div>
  );
}
Задание 1

Tyhjässä komponentissa App luo komponentti Parent, ja siinä komponentti Daughter, ja Daughter:ssa komponentti Grandson. Käyttäen kontekstia, välitä App:sta ikäarvon 42, ja käyttäen useContext:ä näytä se komponentissa Daughter.

Задание 2

Ja nyt komponentissa Grandson näytä ikäarvo, jaettuna 2:lla.