atoms(공유 상태)에서 selectors(순수 함수)를 거쳐 React 컴포넌트로 내려가는 data-flow graph를 만들 수 있음Atoms는 컴포넌트가 구독할 수 있는 상태의 단위Selectors는 atoms 상태 값을 동기 또는 비동기 방식을 통해 변환(1) Atoms
import {atom} from "recoil";
// 전역상태관리를 위한 변수
export const fontSizeState = atom({
key: 'fontSizeState', // 내부적으로 atom을 식별하는데 사용됨
default: 14, // atom의 초기값
});
import { useRecoilState } from 'recoil';
function FontButton() {
const [fontSize, setFontSize] = useRecoilState(fontSizeState);
return (
<button onClick={() => setFontSize((size) => size + 1)} style={{fontSize}}>
Click to Enlarge
</button>
);
}
=> 버튼을 클릭하면 버튼의 글꼴크기가 1만큼 증가하며, fontSizeState atom을 사용하는 다른 컴포넌트의 글꼴 크기도 같이 변함
(2) Selectors
import {selector} from "recoil";
import {fontSizeState} from "./atoms";
const fontSizeLabelState = selector({
key: 'fontSizeLabelState',
get: ({get}) => {
const fontSize = get(fontSizeState);
const unit = 'px';
return `${fontSize}${unit}`;
},
});
=> get 속성은 계산될 함수. 전달되는 get인자를 통해 atoms와 다른 selectors에 접근할 수 있음.
useRecoilValue()를 사용해 읽을 수 있음import { useRecoilState } from 'recoil';
import { useRecoilValue } from 'recoil';
function FontButton() {
const [fontSize, setFontSize] = useRecoilState(fontSizeState);
const fontSizeLabel = useRecoilValue(fontSizeLabelState);
return (
<>
<div>Current font size: ${fontSizeLabel}</div>
<button onClick={setFontSize(fontSize + 1)} style={{fontSize}}>
Click to Enlarge
</button>
</>
);
}
(1) 설치
npm install recoil
yarn add recoil
(2) RecoilRoot
리코일 state를 사용하는 컴포넌트들은 <RecoilRoot> 를 필요로 함
<RecoilRoot> 를 사용하기에 가장 좋은 곳은 root component
import Router from "./shared/Router";
import {RecoilRoot} from "recoil";
function App() {
return (
<RecoilRoot> // 이런식으로 감싸주기
<Router />
</RecoilRoot>
);
}
export default App;