메타(구 페이스북)에서 만든 상태관리 라이브러리로, useState를 사용하는 것만큼 사용이 간단하면서 상태 관리를 효과적으로 할 수 있게 도와준다. 공식 문서를 기반으로 기초 개념 및 사용법에 대해 알아보자.
Recoil
Recoil lets you create a data-flow graph that flows from atoms (shared state) through selectors (pure functions) and down into your React components.
위에 말이 리코일의 핵심 개념으로 Recoil은 원자(atom, 공유 상태)에서 selector(순수 함수)를 거쳐 React Componenets로 흐르는 데이터 흐름 그래프를 만들 수 있게 해준다. 여기서 원자(atom)는 리액트 컴포넌트가 구독(subscribe)할 수 있는 상태 단위이며, selector는 이 상태를 동기식 또는 비동기식으로 변환한다.
공식 문서
https://recoiljs.org
기본 사용법
처음 다루다보니 조금 공식 문서를 많이 참고하여 공부하자.
RecoilRoot
RecoilRoot는 리덕스의 Provider와 비슷한 역할을 하여 여러 개의 RecoilRoot가 공존할 수 있으며, atom state의 독립적인 공급자/저장소를 나타낼 수 있다. 컴포넌트에서 recoil과 연동할 때는 해당 컴포넌트와 가장 가까이 있는 RecoilRoot를 사용한다.
import {RecoilRoot} from 'recoil';
function AppRoot() {
return (
<RecoilRoot>
<ComponentThatUsesRecoil />
</RecoilRoot>
);
}
useRecoilState(todoListState)를 사용하면 useState()와 같이 배열의 첫 번째 원소가 상태, 두 번째 원소가 상태를 업데이트하는 함수를 반환하게 된다.
useRecoilValue(todoListState)는 상태 값만 필요할 경우에 사용하면 된다.
useSetRecoilState(todoListState)는 상태를 업데이트하는 함수만 필요한 경우 사용하면 된다.
여기서 상태를 업데이트하는 함수인 setTodoList의 경우 useState의 업데이트 함수처럼 setTodoList(todo) 이런식으로 원하는 값을 바로 넣어 사용해도 되며, setTodoList(prev => [todo, ...prev]) 이런식으로 현재 값을 파라미터로 받아와서 구현할 수 있다.
A selector represents a piece of derived state. You can think of derived state as the output of passing state to a pure function that modifies the given state in some way.
공식 문서에서는 selector가 파생된 상태(derived state)의 조각를 나타낸다고 말하는데, 위에 todo list의 예에서 필터링된 todo list, todo list의 통계값 등을 파생된 상태라고 할 수 있다.
쉽게 말해 selector는 recoil에서 관리하는 상태의 특정 부분만 선택하거나 상태를 사용하여 연산한 값을 조회할 때도 사용하면서, 다른 데이터에 의존하는 동적 데이터를 구축할 수 있게 해주는 것이다.