Recoil 사용 방법에 대해 알아보겠습니다.
Recoil
Recoil 는 페이스북에서 만든 React를 위한 상태 관리 라이브러리입니다. Recoil을 사용하면 atoms (공유 상태)에서 selectors (순수 함수)를 거쳐 React 컴포넌트로 내려가는 data-flow graph를 만들 수 있습니다.
설치
Recoil 패키지는 npm에 존재합니다. 안정한 최신 버전을 설치하기 위해서는 다음의 명령어를 실행하면 됩니다.
또는 yarn을 사용한다면 이 명령어를 사용하면 됩니다.
RecoilRoot
루트에 RecoilRoot
를 감싸줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 import { RecoilRoot } from 'recoil' ;import ToggleOutput from './ToggleOutput' ;import ToggleButton from './ToggleButton' ;function App ( ) { return ( <RecoilRoot> <ToggleOutput /> <ToggleButton /> </RecoilRoot> ); }
사용
Atoms
Atoms 는 상태(state)의 일부를 나타냅니다. Atoms는 어떤 컴포넌트에서나 읽고 쓸 수 있습니다.
atoms.ts
파일을 생성하고 Recoil의 atom function 을 사용하여 필요한 데이터를 설정합니다.
atom 은 두 가지를 요구하는데 첫 번째는 key 로 unique ID 이고 두 번째는 default value 입니다.
1 2 3 4 5 6 7 import { atom } from 'recoil' ;export const isToggleAtom = atom({ key: 'isToggle' , default : false , });
컴포넌트가 atom을 읽게 하기 위해서는 useRecoilValue()
를 다음과 같이 사용하면 됩니다.
1 2 3 4 5 6 7 8 9 import { useRecoilValue } from 'recoil' ;import { isToggleAtom } from './atoms' ;function ToggleOutput ( ) { const isToggle = useRecoilValue(isToggleAtom); return <div>Toggle state: {isToggle}</div>; }
컴포넌트가 atom을 쓰게 하기 위해서는 useSetRecoilState()
를 다음과 같이 사용하면 됩니다.
atom을 읽고 쓰게 하기 위해서는 useRecoilState()
를 사용하면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import { useSetRecoilState } from 'recoil' ;import { isToggleAtom } from './atoms' ;function ToggleButton ( ) { const setToggleAtom = useSetRecoilState(isToggleAtom); const toggle = () => setToggleAtom((prev ) => !prev); return ( <div> <br /> <button onClick={toggle}>Toggle Mode</button> </ div> ); }
Selectors
Selectors 는 devived state를 나타냅니다. devived state 란 state 를 입력받아서 그걸 변형해 반환하는 순수 함수를 거쳐 반환된 값을 말합니다.
atom의 output은 한 가지 형태이므로 조금 더 잘 써먹을 수 있는 형태로 변형해 줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 export interface IToDo { text: string ; id: number ; category: 'TO_DO' | 'DOING' | 'DONE' ; } export const toDoState = atom<IToDo[]>({ key: 'toDo' , default : [], }); export const toDoSelector = selector({ key: 'toDoSelector' , get : ({ get } ) => { const toDos = get (toDoState); return [ toDos.filter((toDo ) => toDo.category === 'TO_DO' ), toDos.filter((toDo ) => toDo.category === 'DOING' ), toDos.filter((toDo ) => toDo.category === 'DONE' ), ]; }, });
category 값을 3개의 타입 형태로 사용할 경우 타입 별로 값을 반환하고 싶을 때 selector를 사용하여 atom에서 각각의 타입 별로 값을 분류하고 합쳐서 하나의 값으로 반환합니다.
참고