단방향 데이터 흐름
Action -> Dispatcher -> Store -> View
Action이 발생하면 Dispatcher 에서 이를 받아와 해석한 후 Store에서 저장된 정보에 변경 가하고 그 결과가 View로 전달되는 데이터 흐름
action을 통해 상태변화가 일어나고 컴포넌트에서는 selector를 사용해 전역 상태의 일부를 구독(sub)
atoms(공유 상태)에서 selectors(순수 함수)를 거쳐 React 컴포넌트로 내려가는 데이터 흐름
state와 비슷하게 react tree 안에서 상태를 저장하고 관리하는 방법
상태의 단위이며 업데이트와 구독이 가능
atom이 업데이트되면 각각 구독된 컴포넌트는 새로운 값을 반영하여 다시 렌더링. 동일한 atom을 여러 컴포넌트에서 사용되는 경우 모든 컴포넌트는 상태를 공유한다.
atoms나 다른 selectors를 입력으로 받아들이는 pure function
상위의 atom이나 selector가 업데이트되면 하위의 selector도 다시 실행된다. 컴포넌트들은 selectors를 atoms처럼 구독할 수 있으며 selectors가 변경되면 컴포넌트들도 다시 렌더링된다.
최소한의 상태 집합만 atoms에 저장하고 다른 모든 파생되는 데이터는 selectors에 명시한 함수를 통해 효율적으로 계산하면 쓸모없는 상태 보존을 방지할 수 있다.
https://ui.toast.com/posts/ko_20210812
https://github.com/pmndrs/zustand
//store
const useBearStore = create((set) => ({
bears: 0,
increasePopulation: () => set((state) => ({ bears: state.bears + 1 })
//use state
function BearCounter() {
const bears = useBearStore((state) => state.bears)
return {bears}
}
//use action
function Controls() {
const increase = useBearStore((state) => state.increasePopulation)
return <button onClick={increase} />
}
//useShallow -> select
const {nuts, honey} = useBearStore(
useShallow(state => ({ nuts: state.nuts, honey: state.honey }))
//slicing store
export const useBoundStore = create((...a) => ({
...createBearSlice(...a),
...createFishSlice(...a),
}))
https://github.com/pmndrs/jotai
const countAtom = atom(0)
https://medium.com/@ian-white/recoil-vs-jotai-vs-zustand-09d3c8bd5bc0