Recoil 이란?
리코일은 2020년 Facebook에서 발표한 상태관리 라이브러리다.
React만으로는 복잡한 상태관리가 어렵기 때문에 별도의 라이브러리를 사용
ex) Redux, Recoil, Zustand, Mobx ...등
Recoil과 다른 상태관리 방법 비교
1. React useState
부모 컴포넌트에서 prop drilling > 불편
공통 prop가 변경될 때마다 계속 re-rendering이 일어남
2. React useContext
상태 마다 Context Provider를 선언해야함
상태 변경될때마다 캐싱 없이 매번 re-rendering이 일어남
3.Redux
전역상태를 수정하기 위해 반드시 액션을 선언해서 수행해야해 데이터의 흐름 예측이 쉬움
좋은 개발자 도구가 있어서 문제 발생시 바로 확인가능
Redux Toolkit을 사용하면 불변성을 지켜줌
초기 구축, 유지보수에 코드 작성 많음..
복잡함..
4. Recoil
코드 작성이 간단하 안정적
설치
npm install recoil
ESLint 설정
useRecoilCallback을 additionalHook목록에 추가
// 수정된 .eslint 설정
{
"plugins": ["react-hooks"],
"rules": {
"react-hooks/rules-of-hooks": "error",
"react-hooks/exhaustive-deps": [
"warn",
{
"additionalHooks": "useRecoilCallback"
}
]
}
}
주요개념
리코일을 사용하면 atoms(공유 상태)에서 selectors(순수 함수)를 거처 react컴포넌트로 내려가는 data-flow graph를 만들수있다.
RecoilRoot
recoil 상태를 사용하는 컴포넌트는 부모 트리 어딘가에 나타나는 RecoilRoot 가 필요하다.
루트 컴포넌트가 RecoilRoot를 넣기에 가장 좋은 장소다.
import React from 'react';
import {
RecoilRoot,
atom,
selector,
useRecoilState,
useRecoilValue,
} from 'recoil';
function App() {
return (
<RecoilRoot>
<CharacterCounter />
</RecoilRoot>
);
}
Atoms
Atoms는 상태의 단위, 업데이트와 구독이 가능하다
atom이 업데이트되면 각각 구독된 컴포넌트는 새로운 값을 반영하여 다시 렌더링 된다.
Atoms는 React 로컬 컴포넌트의 상태 대신 사용.
여러 컴포넌트에서 사용되는 경우 모든 컴포넌트는 상태를 공유한다.
Atoms는 atom함수를 사용해서 생성.
const textState = atom({
key: 'textState', // unique ID (with respect to other atoms/selectors)
default: '', // default value (aka initial value)
});
고유한키 값과 기본 값을 가진다.
컴포넌트에서 atom을 읽고 쓰려면 useRecoilState라는 훅을 사용한다. useState와 비슷하지만 컴포넌트간에 상태를 공유할 수 있다.
function CharacterCounter() {
return (
<div>
<TextInput />
<CharacterCount />
</div>
);
}
function TextInput() {
const [text, setText] = useRecoilState(textState);
const onChange = (event) => {
setText(event.target.value);
};
return (
<div>
<input type="text" value={text} onChange={onChange} />
<br />
Echo: {text}
</div>
);
}
Selectors
Selectors는 atms나 다른 selectors를 입력으로 받는 순수 함수다.
상위의 atoms 또는 selectors를 atmos처럼 구독할 수 있으며 selectors가 변경되면 컴포넌트들도 re-rendering된다.
Selectors는 상태를 기반으로 하는 파생데이터를 계산하는 데 사용한다.
최소한의 상태집합만 atoms에 저장하고 다른 모든 파생되는 데이터는 selectors에 명시한 함수를 통해 계산함으로 쓸모 없는 상태의 보존을 막는다.
컴포넌트의 관점에서 보면 Selectors와 Atoms는 동일한 인터페이스를 가지므로 서로 대체할 수 있다.
Selectors는 selector함수를 사용해 정의한다.
const charCountState = selector({
key: 'charCountState', // unique ID (with respect to other atoms/selectors)
get: ({get}) => {
const text = get(textState);
return text.length;
},
});
get인자를 통해 atmos와 다른selectors에 접근할 수있다.
접근하면 자동으로 종속관계 생성 -> 업데이트되면 이 함수도 다시 실행
Selectors는 useRecoilVaule()를 사용해 읽을 수 있다.
하나의 atom 이나 selector를 인자로 받아 값을 반환한다.
function CharacterCount() {
const count = useRecoilValue(charCountState);
return <>Character Count: {count}</>;
}
참고사이트
동기 | Recoil
호환성 및 단순함을 이유로 외부의 글로벌 상태관리 라이브러리보다는 React 자체에 내장된 상태 관리 기능을 사용하는 것이 가장 좋다.
recoiljs.org
Recoil을 이용한 손쉬운 상태관리
Recoil의 장단점과 함께 효과적으로 상태관리 할 수 있는 방법을 소개하려고 합니다!
techblog.yogiyo.co.kr
'STUDY > react' 카테고리의 다른 글
react-i18next 알아보기 (1) | 2024.11.03 |
---|---|
리액트에서 `key`에 `index`를 넣으면 안 되는 이유 (1) | 2024.09.22 |
리액트에서 줄바꿈 처리하는 방법 - CSS white-space 속성 쓰기 (0) | 2024.05.27 |
[react-fullpage] 리액트 화면 딱맞게 스크롤 되는거 새로고침문제 (1) | 2024.04.17 |