🗝️ 기존에는 불변성을 유지하기 위해 스프레드 연산자를 사용해서 새로운 객체로 업데이트 해줬지만, set 함수를 사용하면 그 과정을 생략할 수 있음
Immutable state and merging 참고하기
(상태를 불변성을 유지하면서 업데이트된다는 것은, 상태를 변경할 때 기존 상태를 직접 수정하는 것이 아니라 새로운 상태를 생성해서 교체한다는 의미입니다. 이렇게 하면 예전 상태와 새로운 상태를 명확하게 구할 수 있고, 이전 상태를 참조하거나 되돌리는 등의 작업이 수월해집니다. 불변성은 리액트의 성능 최적화와 밀접한 관련이 있습니다.
set 함수는 Zustand에서 제공하는 상태를 업데이트하는 함수입니다. 이 함수를 통해 새로운 상태를 설정하면, 이전 상태와 새로운 상태가 병합(merge)됩니다. 병합이라는 말은, 기존의 상태 객체와 새로운 상태 객체가 합쳐져서 최종 상태를 형성한다는 것을 의미합니다. 이 때, 같은 키를 가진 값은 새로운 상태의 값으로 덮어씌워지게 됩니다. 이러한 기능 덕분에 Zustand에서는 상태를 부분적으로 업데이트하는 것이 가능합니다.)
import { create } from 'zustand'
const useBearStore = create((set) => ({
bears: 0,
increasePopulation: () => set((state) => ({ bears: state.bears + 1 })),
removeAllBears: () => set({ bears: 0 }),
}))
function BearCounter() {
const bears = useBearStore((state) => state.bears)
return <h1>{bears} around here ...</h1>
}
function Controls() {
const increasePopulation = useBearStore((state) => state.increasePopulation)
return <button onClick={increasePopulation}>one up</button>
}