createContext
createContext
дозволяє створити контекст, який компоненти можуть надавати або читати.
const SomeContext = createContext(defaultValue)
Довідник
createContext(defaultValue)
Виклик createContext
поза будь-якими компонентами для створення контексту.
import { createContext } from 'react';
const ThemeContext = createContext('light');
Дивіться більше прикладів нижче.
Параметри
defaultValue
: Значення, яке ви хочете, щоб контекст мав, коли немає відповідного постачальника контексту у дереві над компонентом, який читає контекст. Якщо ви не маєте жодного значення за замовчуванням, вкажітьnull
. Значення за замовчуванням призначене для використання в якості "останньої надії". Воно є статичним і ніколи не змінюється з часом.
Повернення
createContext
повертає об'єкт контексту.
Сам об'єкт контексту не містить жодної інформації. Він представляє контекст, який читають або надають інші компоненти. Зазвичай, ви використовуєте SomeContext.Provider
у компонентах вище, щоб вказати значення контексту, і викликаєте useContext(SomeContext)
у компонентах нижче, щоб прочитати його. Об'єкт контексту має декілька властивостей:
SomeContext.Provider
Дозволяє надати значення контексту компонентам.SomeContext.Consumer
є альтернативним і рідко використовуваним способом читання значення контексту.
SomeContext.Provider
Обгортайте ваші компоненти в провайдер контексту, щоб вказати значення цього контексту для всіх компонентів всередині:
function App() {
const [theme, setTheme] = useState('light');
// ...
return (
<ThemeContext.Provider value={theme}>
<Page />
</ThemeContext.Provider>
);
}
Пропси
value
: Значення, яке ви хочете передати всім компонентам, що читають цей контекст всередині цього провайдера, незалежно від глибини. Значення контексту може бути будь-якого типу. Компонент, який викликаєuseContext(SomeContext)
всередині провайдера, отримуєзначення
найглибшого відповідного провайдера контексту над ним.
SomeContext.Consumer
До появи useContext
існував старий спосіб читання контексту:
function Button() {
// 🟡 Legacy way (not recommended)
return (
<ThemeContext.Consumer>
{theme => (
<button className={theme} />
)}
</ThemeContext.Consumer>
);
}
Хоча цей старий спосіб все ще працює, але новостворений код повинен читати контекст за допомогою useContext()
замість цього:
function Button() {
// ✅ Recommended way
const theme = useContext(ThemeContext);
return <button className={theme} />;
}
Пропси
children
: Функція. React викличе передану вами функцію зі значенням поточного контексту, визначеним за тим же алгоритмом, що іuseContext()
, і відрендерить результат, який ви повернете з цієї функції. React також повторно запустить цю функцію і оновлюватиме інтерфейс щоразу, коли змінюється контекст батьківських компонентів.
Використання
Створення контексту
Контекст дозволяє компонентам передавати інформацію вглиб без явної передачі пропсів.
Викличте createContext
поза будь-якими компонентами, щоб створити один або кілька контекстів.
import { createContext } from 'react';
const ThemeContext = createContext('light');
const AuthContext = createContext(null);
createContext
повертає
function Button() {
const theme = useContext(ThemeContext);
// ...
}
function Profile() {
const currentUser = useContext(AuthContext);
// ...
}
За замовчуванням, значення, які вони отримають, будуть значеннями Тепер компонент Дізнайтеся більше про читання та надання контексту і перегляньте приклади. Часто компоненти у різних файлах потребують доступу до одного й того самого контексту. Ось чому прийнято оголошувати контексти в окремому файлі. Тоді ви можете використовувати інструкцію Компоненти, оголошені в інших файлах, можуть використовувати Це працює подібно до імпорту та експорту компонентів. Такий код задає значення контексту за замовчуванням : Це значення ніколи не змінюється. React використовує це значення лише як запасний варіант, якщо не може знайти відповідний провайдер вище. Щоб контекст змінювався з часом, додайте стан та обгорніть компоненти в провайдер контексту.Page
і всі компоненти всередині нього, незалежно від глибини, "бачитимуть" передані значення контексту. Якщо передані значення контексту зміняться, React також повторно відрендерить компоненти, що читають контекст.
Імпорт та експорт контексту з файлу
експорт
, щоб зробити контекст доступним для інших файлів:// Contexts.js
import { createContext } from 'react';
export const ThemeContext = createContext('light');
export const AuthContext = createContext(null);
імпорт
для читання або надання цього контексту:// Button.js
import { ThemeContext } from './Contexts.js';
function Button() {
const theme = useContext(ThemeContext);
// ...
}
// App.js
import { ThemeContext, AuthContext } from './Contexts.js';
function App() {
// ...
return (
<ThemeContext.Provider value={theme}>
<AuthContext.Provider value={currentUser}>
<Page />
</AuthContext.Provider>
</ThemeContext.Provider>
);
}
Налагодження
Я не можу знайти спосіб змінити значення контексту
const ThemeContext = createContext('light');