Вопрос проверяет понимание необходимости стейт-менеджеров и их отличий от Context API для управления состоянием в React.
В React состояние обычно локально для компонента. Когда приложение растет, возникает необходимость делить состояние между многими компонентами, часто расположенными далеко друг от друга в дереве. Стейт-менеджеры, такие как Redux, MobX или Zustand, предоставляют единое хранилище (store) и строгие правила для его изменения, что делает поток данных предсказуемым и упрощает отладку.
Context API — встроенный механизм React для передачи данных без пропс-дриллинга. Он прост в использовании, но имеет недостатки: при изменении значения контекста все компоненты, которые его потребляют, перерендериваются, даже если они не используют изменившуюся часть. Это может привести к проблемам с производительностью в больших приложениях.
Рассмотрим приложение с корзиной покупок. Используя Context:
const CartContext = React.createContext();
function CartProvider({ children }) {
const [items, setItems] = useState([]);
const addItem = (item) => setItems(prev => [...prev, item]);
return (
<CartContext.Provider value={{ items, addItem }}>
{children}
</CartContext.Provider>
);
}Любой компонент, использующий useContext(CartContext), будет перерендерен при каждом добавлении товара, даже если он показывает только общую сумму.
С Redux:
// slice
const cartSlice = createSlice({
name: 'cart',
initialState: { items: [] },
reducers: {
addItem: (state, action) => { state.items.push(action.payload); },
},
});
// component
function TotalPrice() {
const total = useSelector(state =>
state.cart.items.reduce((sum, item) => sum + item.price, 0)
);
return <div>Total: {total}</div>;
}Здесь TotalPrice перерендерится только если изменится вычисляемая сумма, а не при любом изменении корзины.
Используйте Context для простого глобального состояния (тема, язык), которое редко меняется. Для сложного, часто обновляемого состояния с множеством потребителей выбирайте стейт-менеджер — это даст лучшую производительность и предсказуемость.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию