Skip to main content

Що робить `useContext()`?

Що робить useContext()

Хук useContext() дозволяє дістати значення з контексту React, яке було передане через компонент <Context.Provider> десь вище по дереву.

Простіше кажучи: useContext дозволяє компоненту "дотягнутися" до спільних даних, без передачі їх через props.


Як це працює (крок за кроком)

1. Створюємо контекст

javascript
import { createContext } from "react"; export const ThemeContext = createContext("light");

createContext() створює об'єкт контексту з методом .Provider і .Consumer.


2. Обгортаємо частину застосунку в Provider

javascript
function App() { return ( <ThemeContext.Provider value="dark"> <Toolbar /> </ThemeContext.Provider> ); }

Усе, що знаходиться всередині <ThemeContext.Provider>, отримає доступ до значення "dark".


3. Отримуємо значення контексту в будь-якому вкладеному компоненті через useContext

javascript
import { useContext } from "react"; import { ThemeContext } from "./ThemeContext"; function Button() { const theme = useContext(ThemeContext); return <button className={theme}>Тема: {theme}</button>; }

Тепер Button знає, яка тема обрана (dark), хоча ніхто явно не передавав цей проп!


Приклад використання зі станом

Контекст часто комбінують зі станом, щоб передавати динамічні дані (наприклад, тему, мову, користувача).

javascript
const ThemeContext = createContext(); function App() { const [theme, setTheme] = useState("light"); return ( <ThemeContext.Provider value={{ theme, setTheme }}> <Toolbar /> </ThemeContext.Provider> ); } function Toolbar() { const { theme, setTheme } = useContext(ThemeContext); return ( <button onClick={() => setTheme(theme === "light" ? "dark" : "light")}> Перемкнути тему (поточна: {theme}) </button> ); }

Тепер будь-яка кількість компонентів може читати і змінювати тему, без прокидання props через кожен рівень.


Коли використовувати useContext

КолиЧому
Дані потрібні в багатьох компонентахНаприклад, поточний користувач, мова, тема, налаштування
Не хочеться передавати props вручнуuseContext прибирає "проп-дрилінг"
Потрібен глобальний "стейт" без Redux чи ZustandКонтекст + useState = проста глобальна логіка

Важливо знати

ОсобливістьПояснення
useContext оновлює компонент при зміні значення контекстуЯкщо value змінився, усі підписники перемалюються
Контекст не кешується як useMemoОновлення передаються синхронно
Контекст не можна викликати поза ProviderІнакше значення буде з createContext(defaultValue)
Контексти можна вкладатиReact коректно їх об'єднує

Відмінність від props

ПропсиuseContext
Передаються згори вниз вручнуАвтоматично доступні всім нащадкам
Працюють локальноПрацюють глобально в межах Provider
Гнучкіші й прозорішіЗручніші для глобальних даних

Підсумок

ПитанняВідповідь
Що робить useContext()Дозволяє отримати доступ до значення з найближчого Context.Provider
Коли використовуватиКоли потрібно ділитися спільними даними між компонентами без props
Що повертаєПоточне значення контексту
Приклади використанняТема оформлення, мова, користувач, налаштування, стан авторизації

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.