Экосистема React за последние годы добилась значительных успехов в управлении состоянием. Redux, когда-то считавшийся идеальным решением для управления состоянием в сложных приложениях React, больше не является единственным игроком в городе. С введением Context API и React Query у разработчиков теперь есть мощные альтернативы, которые предлагают более рациональный и интуитивно понятный подход к управлению состоянием. В этой статье мы рассмотрим, почему Redux теряет свое очарование, и углубимся в то, как Context API и React Query могут эффективно справляться как с локальным, так и с удаленным управлением состоянием.

Упадок Redux:
Redux долгое время был основным продуктом разработки React благодаря предсказуемому управлению состоянием и надежной экосистеме промежуточного программного обеспечения и инструментов. Однако по мере развития React его собственные возможности обработки состояния значительно улучшились. С введением таких хуков, как useState и useReducer, React теперь предлагает легкое и более простое решение для управления локальным состоянием внутри компонентов. Этот сдвиг привел к снижению необходимости использования Redux для многих проектов.
Управление локальным состоянием с помощью Context API и useReducer:
Context API, представленный в React 16.3, предоставляет встроенное решение для управления глобальным состоянием без необходимости использования внешних библиотек, таких как Redux. Это позволяет более интуитивно обмениваться состоянием между компонентами. Контекстный API в сочетании с хуком useReducer может эффективно обрабатывать локальное управление состоянием.
Давайте рассмотрим пример, в котором у нас есть простой компонент-счетчик, которому необходимо поддерживать свое собственное состояние:
import React, { useContext, useReducer } from 'react';
const CounterContext = React.createContext();
const initialState = { count: 0 };
const reducer = (state, action) => {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
};
const Counter = () => {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<CounterContext.Provider value={{ state, dispatch }}>
<div>
Count: {state.count}
<button onClick={() => dispatch({ type: 'INCREMENT' })}>Increment</button>
<button onClick={() => dispatch({ type: 'DECREMENT' })}>Decrement</button>
</div>
</CounterContext.Provider>
);
};
const DisplayCount = () => {
const { state } = useContext(CounterContext);
return <div>Count: {state.count}</div>;
};
В приведенном выше примере мы создаем компонент-счетчик, который поддерживает свое состояние с помощью хука useReducer. Мы создаем контекст, используя React.createContext(), и предоставляем состояние и функцию отправки дочерним компонентам, используя CounterContext.Provider. Компонент DisplayCount получает состояние из контекста и отображает его.
Этот подход устраняет необходимость в дополнительной настройке и шаблонном коде, который требуется Redux. Это также упрощает поток данных, упрощая его анализ и обслуживание.
Удаленное управление состоянием с помощью React Query. Хотя управление локальным состоянием имеет решающее значение, многие приложения также требуют эффективного управления удаленными данными. Вот где сияет React Query. React Query — это мощная библиотека для извлечения данных, которая упрощает обработку удаленного состояния, предоставляя декларативный и эффективный подход.
Давайте рассмотрим пример, в котором мы получаем список задач из API и отображаем их:
import React from 'react';
import { useQuery } from 'react-query';
const TodoList = () => {
const { data, isLoading, error } = useQuery('todos', () =>
fetch('https://api.example.com/todos').then((res) => res.json())
);
if (isLoading) {
return <div>Loading...</div>;
}
if (error) {
return <div>Error: {error.message}</div>;
}
return (
<div>
{data.map((todo) => (
<div key={todo.id}>{todo.title}</div>
))}
</div>
);
};
В этом примере мы используем хук useQuery, предоставляемый React Query, для получения задач из API. React Query выполняет кэширование, автоматическую повторную загрузку и обработку ошибок, что позволяет нам сосредоточиться на логике рендеринга. Он обеспечивает чистый и лаконичный способ управления удаленным состоянием, устраняя необходимость в сложных абстракциях, таких как промежуточное ПО Redux.
Redux, несомненно, сыграл значительную роль в истории управления состоянием React. Однако с развитием самого React у нас теперь есть альтернативы, такие как Context API и React Query, которые предлагают более простые и интуитивно понятные решения как для локального, так и для удаленного управления состоянием. Используя эти новые инструменты, разработчики могут оптимизировать свою кодовую базу, улучшить ремонтопригодность и воспользоваться преимуществами последних достижений в экосистеме React. Итак, попрощайтесь с Redux и примите развивающийся ландшафт управления состоянием в React.

Дополнительные материалы на PlainEnglish.io.
Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .