간소화된 Flux 원칙을 사용하는 작고 빠르고 확장 가능한 barebone(매우 간단한) 상태 관리 솔루션
설치
npm install zustand
yarn add zustand
기본 스토어 생성
create 함수를 사용하여 상태를 정의하고, set을 통해 값을 변경한다.
import { create } from "zustand";
const useStore = create((set) => ({
count: 0,
increase: () => set((state) => ({ count: state.count + 1 })),
decrease: () => set((state) => ({ count: state.count - 1 })),
}));
상태 사용
useStore()를 호출해 상태를 가져오고, 버튼 클릭 시 increase, decrease 함수를 실행하여 상태를 업데이트한다.
function Counter() {
const { count, increase, decrease } = useStore();
return (
<div>
<p>Count: {count}</p>
<button onClick={increase}>+</button>
<button onClick={decrease}>-</button>
</div>
);
}
상태 선택 (Selector)
Zustand는 필요한 값만 가져와서 사용할 수 있다.
이렇게 하면 count 값이 변경될 때만 리렌더링되므로 성능 최적화가 가능하다.
const count = useStore((state) => state.count);
미들웨어 활용 (Persist, DevTools 등)
Zustand는 미들웨어를 통해 기능을 확장할 수 있다.
import { create } from "zustand";
import { persist } from "zustand/middleware";
// persist를 사용하면 상태를 로컬 스토리지에 저장할 수 있다.
const useStore = create(
persist(
(set) => ({
count: 0,
increase: () => set((state) => ({ count: state.count + 1 })),
}),
{ name: "count-storage" }
)
);
비동기 상태 관리
비동기 API 호출도 간단하게 처리 가능하다.
fetchUser를 호출하면 비동기적으로 데이터를 가져와 상태를 업데이트한다.
const useStore = create((set) => ({
user: null,
fetchUser: async () => {
const response = await fetch("https://jsonplaceholder.typicode.com/users/1");
const data = await response.json();
set({ user: data });
},
}));