Context API — это встроенная в React система управления состоянием (state management), которая позволяет передавать данные через дерево компонентов без необходимости явно передавать пропсы (props) на каждом уровне (пропс дриллинг).
import { createContext } from 'react';
const ThemeContext = createContext('light'); // Значение по умолчанию
function App() {
return (
<ThemeContext.Provider value="dark">
<Toolbar />
</ThemeContext.Provider>
);
}
function Button() {
const theme = useContext(ThemeContext);
return <button className={theme}>Кнопка</button>;
}
function Button() {
return (
<ThemeContext.Consumer>
{theme => <button className={theme}>Кнопка</button>}
</ThemeContext.Consumer>
);
}
function App() {
const [theme, setTheme] = useState('dark');
const toggleTheme = () => {
setTheme(prev => prev === 'dark' ? 'light' : 'dark');
};
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
<Toolbar />
</ThemeContext.Provider>
);
}
function ThemeProvider({ children }) {
const [theme, setTheme] = useState('light');
const value = {
theme,
toggleTheme: () => setTheme(prev => prev === 'light' ? 'dark' : 'light')
};
return (
<ThemeContext.Provider value={value}>
{children}
</ThemeContext.Provider>
);
}
// Использование
<ThemeProvider>
<App />
</ThemeProvider>
function App() {
return (
<ThemeContext.Provider value="dark">
<UserContext.Provider value={{ name: 'John' }}>
<Content />
</UserContext.Provider>
</ThemeContext.Provider>
);
}
function App() {
const [user, setUser] = useState({ name: 'John', age: 30 });
const value = useMemo(() => ({ user, setUser }), [user]);
return (
<UserContext.Provider value={value}>
<Content />
</UserContext.Provider>
);
}
Лучше иметь несколько специализированных контекстов, чем один большой:
// Плохо:
<UserContext.Provider value={{ user, settings, preferences }}>
// Хорошо:
<UserContext.Provider value={user}>
<SettingsContext.Provider value={settings}>
<PreferencesContext.Provider value={preferences}>
const [state, dispatch] = useReducer(reducer, initialState);
return (
<StateContext.Provider value={state}>
<DispatchContext.Provider value={dispatch}>
Характеристика | Context API | Redux | MobX |
---|---|---|---|
Встроен в React | ✅ | ❌ | ❌ |
Кривая обучения | Низкая | Средняя | Высокая |
Подходит для | Средних приложений | Крупных приложений | Крупных приложений |
DevTools | ❌ | ✅ | ✅ |
<UserContext.Provider value={{ user, setUser }}> // ❌ Создает новый объект при каждом рендере
Для глубокой интеграции рассмотрите кастомные хуки + контекст.