Хук контекста useContext в React
В этом уроке мы продолжим работу с
контекстом. Теперь построим дерево
компонентов. Для начала в отдельном
файле создадим React компонент
BigBox
:
function BigBox() {
return (
<p>bigbox</p>
);
}
Импортируем его и разместим в нашем
главном компоненте App
:
import BigBox from './BigBox';
function App() {
return (
<BigBox />
);
}
Для большей наглядности немного
стилизуем
дивы. Для этого создадим файл
styles.css
:
div {
border: 1px solid blue;
margin: 10px;
text-align: center;
max-width: 300px;
}
Не забудем импортировать его
в App.js
:
import './styles.css';
Теперь в отдельном файле создадим
компонент MiddleBox
:
function MiddleBox() {
return (
<p>middlebox</p>
);
}
И положим его в большую
коробку BigBox
:
import MiddleBox from './MiddleBox';
function BigBox() {
return (
<div>
<MiddleBox />
</div>
);
}
Проделаем все тоже самое с маленькой
коробочкой SmallBox
:
function SmallBox() {
return (
<p>I am ... </p>
);
}
Разместим две таких коробочки в
MiddleBox
:
import SmallBox from './SmallBox';
function MiddleBox() {
return (
<div>
<SmallBox />
<SmallBox />
</div>
);
}
Дерево мы с вами построили. А теперь мы
хотим от нашего App
передать,
предположим, в SmallBox
строковое
значение 'small box :)'
, не
используя пропсы, а пользуясь
контекстом (вдруг наше коробочное
приложение разрастется до огромных
размеров).
Файл с контекстом MyContext.js
мы
уже создали и подключили на прошлом уроке.
Следующий шаг, который мы сделаем - обернем
BigBox
в провайдер контекста,
который является свойством нашего объекта
контекста MyContext
. Теперь все
компоненты, заключенные в данную конструкцию
(а это и все коробочки, вложенные в
BigBox
) смогут получить доступ и
подписаться на изменения контекста. В качестве
значения контекста мы передаем желаемое
'small box :)'
:
function App() {
return (
<MyContext.Provider value="small box :)">
<BigBox />
</MyContext.Provider>
);
}
А теперь осталось прочитать значение
контекста. Мы хотели использовать его в
SmallBox
, значит импортируем
туда файл контекста MyContext.js
и хук useContext
:
import { useContext } from 'react';
import { MyContext } from './MyContext.js';
Прочитаем с помощью useContext
значение контекста в переменную name
:
function SmallBox() {
const name = useContext(MyContext);
return (
<div>
<p>I am ... </p>
</div>
);
}
Мы подписали SmallBox
на данный
контекст и, если он изменится, этот
компонент также будет обновлен.
И, наконец, подставляем значение переменной
name
вместо многоточия:
function SmallBox() {
const name = useContext(MyContext);
return (
<div>
<p>I am {name} </p>
</div>
);
}
В пустом компоненте App
создайте
компонент Parent
, а в нем компонент
Daughter
, а в Daughter
компонент
Grandson
. Используя контекст,
передайте из App
значение
возраста 42
, а с помощью
useContext
выведите его в
компоненте Daughter
.
А теперь в компоненте Grandson
выведите значение возраста,
но поделенное на 2
.