Jotai и другие атом-базированные хранилища
Атом-базированные хранилища представляют собой современную концепцию для управления состоянием в React-приложениях. В отличие от более традиционных способов, таких как Redux или Context API, атомы являются минимальными единицами состояния, которые можно отслеживать и изменять независимо друг от друга. Одним из самых популярных решений для работы с атомами является библиотека Jotai, которая предлагает простой, но мощный способ работы с состоянием.
Jotai реализует концепцию атомов, которые можно рассматривать как независимые единицы состояния. Каждый атом хранит данные и может быть изменен, а также отслежен с помощью React hooks. Атомы в Jotai — это объекты, содержащие данные, и они могут быть использованы для создания глобального состояния, которое легко интегрируется с компонентами.
Основной элемент в Jotai — это атом, который создается с помощью
функции atom(). Например:
import { atom } from 'jotai';
const countAtom = atom(0);
Этот код создает атом countAtom, который содержит
числовое состояние с начальным значением 0. Для
использования атома в компоненте React применяются хук
useAtom().
import { useAtom } from 'jotai';
function Counter() {
const [count, setCount] = useAtom(countAtom);
return (
<div>
<p>{count}</p>
<button onCl ick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
Здесь компонент Counter использует атом
countAtom, извлекая из него текущее значение состояния и
функцию для его обновления. Благодаря реактивности Jotai, изменения
состояния автоматически приводят к обновлению компонента.
В Jotai можно не только создавать простые атомы, но и создавать производные атомы, которые зависят от других атомов. Такие атомы автоматически обновляются, когда их зависимые атомы изменяются. Это позволяет эффективно управлять сложным состоянием и избегать избыточных вычислений.
Для создания производного атома используется функция
atom() с другим атомом в качестве аргумента:
const doubleCountAtom = atom((get) => get(countAtom) * 2);
Здесь doubleCountAtom зависит от countAtom
и будет автоматически обновляться при изменении countAtom.
Чтобы использовать этот атом в компоненте:
function DoubleCounter() {
const [doubleCount] = useAtom(doubleCountAtom);
return <p>{doubleCount}</p>;
}
Такой подход позволяет гибко управлять состоянием, создавая вычисляемые данные на основе других атомов.
Jotai предоставляет возможность работать с асинхронными атомами, что особенно полезно при загрузке данных с сервера или выполнении других асинхронных операций. Для этого можно использовать атомы, которые создаются с помощью промисов или асинхронных функций.
Пример атома для асинхронной операции:
const fetchDataAtom = atom(async (get) => {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data;
});
Этот атом будет хранить результат асинхронной операции и автоматически обновлять состояние при получении данных.
Сложные состояния в Jotai могут включать массивы, объекты или другие структуры данных. Для работы с ними Jotai предоставляет возможность комбинировать атомы и создавать более сложные зависимости. Например, можно создать атом, который будет хранить список элементов и предоставлять методы для добавления и удаления элементов:
const listAtom = atom([]);
const addItemAtom = atom(
null,
(get, set, item) => {
const list = get(listAtom);
set(listAtom, [...list, item]);
}
);
Здесь создаются два атома: listAtom, который хранит
список, и addItemAtom, который добавляет новый элемент в
этот список. Такой подход упрощает работу с состоянием, уменьшая
количество лишних повторений и обеспечивая чистоту кода.
Jotai выделяется на фоне других решений, таких как Redux или Zustand, благодаря своей простоте и гибкости. В отличие от Redux, где необходимо создавать редьюсеры и обрабатывать множество экшенов, Jotai предоставляет более прямолинейный и менее обременительный API, который сосредоточен на атомах.
Zustand — это ещё одна популярная библиотека для управления состоянием, которая ориентирована на глобальное состояние и использует более функциональный подход, чем Jotai. В то время как Zustand позволяет сохранять глобальное состояние в хранилище, Jotai придерживается атомной концепции, где каждый атом представляет собой независимую единицу состояния.
Redux по-прежнему остается одним из самых мощных инструментов для работы с состоянием в крупных приложениях, но требует больше конфигурации и структуры. Jotai подходит для приложений, где требуется лёгкость и минимализм.
Jotai можно интегрировать с другими библиотеками и инструментами для улучшения функционала. Например, можно использовать Jotai-devtools для отладки состояний, что значительно упрощает процесс разработки. Для этого нужно установить дополнительный пакет:
npm install jotai-devtools
После этого можно подключить devtools к приложению:
import { Devtools } from 'jotai-devtools';
function App() {
return (
<>
<Devtools />
{/* остальной код приложения */}
</>
);
}
Эта интеграция позволяет отслеживать изменения состояния и глубже понимать, как работают атомы в приложении.
Атомные хранилища, такие как Jotai, обладают несколькими ключевыми преимуществами:
Jotai представляет собой современное решение для управления состоянием в React-приложениях, которое упрощает работу с состоянием, предлагая атомы как единицы данных. Это решение идеально подходит для небольших и средних проектов, где важна простота и производительность. В то время как более традиционные решения, такие как Redux, могут предложить больше функционала для крупных приложений, Jotai остаётся отличным выбором для тех, кто ценит минимализм и гибкость.