Контекстуални хук useContext у React-у

У овом лекцији наставићемо са радом са контекстом. Сада ћемо изградити стабло компоненти. За почетак у одвојеној датотеци креирајмо React компоненту BigBox:

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

Импортујмо је и сместимо у нашој главној компоненти App:

App.jsximport BigBox from './BigBox';

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

За већу јасноћу мало ћемо стилизовати див-ове. За то креирајмо датотеку styles.css:

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

Не заборавимо да је импортујемо у App.js:

App.jsximport './styles.css';

Сада у одвојеној датотеци креирајмо компоненту MiddleBox:

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

И ставимо је у велику кутију BigBox:

BigBox.jsximport MiddleBox from './MiddleBox';

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

Поновимо исто и са малом кутијом SmallBox:

SmallBox.jsxfunction SmallBox() {
  return (
    <p>I am ... </p>
  );
}

Сместимо две такве кутије у MiddleBox:

MiddleBox.jsximport SmallBox from './SmallBox';

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

Стабло смо изградили. А сада желимо да из нашег App проследимо, претпоставимо, у SmallBox стринг вредност 'small box :)', без употребе пропса, већ користећи се контекстом (у случају да се наша апликација са кутијама прошири на огромне размере).

Датотеку са контекстом MyContext.js смо већ креирали и повезали на претходној лекцији.

Следећи корак који ћемо урадити је да обавијемо BigBox у провајдер контекста, који је својство нашег објекта контекста MyContext. Сада све компоненте, затворене у ову конструкцију (а то су све кутије, угнежђене у BigBox) моћи ће да добију приступ и да се претплате на промене контекста. Као вредност контекста прослеђујемо жељену 'small box :)':

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

А сада је остало да прочитамо вредност контекста. Желели смо да га користимо у SmallBox, значи да у њу увозимо датотеку контекста MyContext.js и хук useContext:

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

Прочитајмо помоћу useContext вредност контекста у променљиву name:

SmallBox.jsxfunction SmallBox() {
  const name = useContext(MyContext);
  
  return (
    <div>
      <p>I am ... </p>
    </div>
  );
}

Претплатили смо SmallBox на овај контекст и, ако се он промени, ова компонента ће такође бити ажурирана.

И, коначно, заменимо вредност променљиве name уместо тачака:

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

У празној компоненти App креирајте компоненту Parent, а у њој компоненту Daughter, а у Daughter компоненту Grandson. Користећи контекст, проследите из App вредност године 42, а помоћу useContext прикажите је у компоненти Daughter.

Задание 2

А сада у компоненти Grandson прикажите вредност године, али подељену са 2.