📖React의 localState의 한계를 보완하여 전역적 상태관리를 하기 위하여 Recoil의 기본적인 개념과 기초 사용방법을 알아보자.
📖React 자체 내장된 상태 관리 기능의 한계를 극복하여 API와 상태의 의미와 동작을 가능한 React 답게 유지하기 위하여 사용한다.
즉, Recoil은 React 상태 관리의 한계를 극복하여 불필요한 렌더링 현상을 축소하고, 공유 상태를 내부 상태처럼 간단한 인터페이스로 사용할 수 있도록 지원한다.
또한, 코드 분할의 용이성을 통해 유지보수 및 재사용에 도움을 준다.
// 안전화된 최신 버전
npm install recoil
// CDN
<script src="https://cdn.jsdelivr.net/npm/recoil@0.0.11/umd/recoil.production.js"></script>
// ESLint(eslint-plugin-hooks 사용의 경우)
{
"plugins": ["react-hooks"],
"rules": {
"react-hooks/rules-of-hooks": "error",
"react-hooks/exhaustive-deps": [
"warn",
{
"additionalHooks": "useRecoilCallback"
}
]
}
}
📖상태의 단위로 업데이트와 구독이 가능하다. atom이 업데이트되면 구독된 컴포넌트는 새로운 값을 반영하여 리-렌더링된다. 동일한 atom이 여러 컴포넌트들에서 사용이 되는 경우 해당 컴포넌트들은 상태를 공유한다.
// atom 생성
const testState = atom({
key: 'testState', // 고유한 키값으로 전역적으로 고유해야한다. (2개 이상의 atom이 같은 키값을 갖는 경우 오류 발생)
default: '', // state의 기본값
});
// atom 호출
export const TestButton = () => {
// React의 컴포넌트 상태 : const [testState, setTestState] = useState('');
const [testState, setTestState] = useRecoilState(testState); // useState()와 비슷하게 사용되지만 컴포넌트 간 상태 공유가 가능하다.
return (
<button onClick={() => setTestState()}>Click</button>
);
};
📖atoms나 다른 selectors를 입력으로 받아들이는 순수 함수. 상위의 atoms 또는 selectors가 업데이트되면 하위의 selectors 함수도 다시 실행되는 특성이 있다.
atoms와 마찬가지로 컴포넌트들이 구독할 수 있으며, selectors의 변경에 따라 구독한 컴포넌트들이 리-렌더링되는 것도 동일하다.
selectors의 주요 특징은 다음과 같다.
사용은 다음과 같다.
// selector 생성
const testSelectorState = selector({
key: 'testSelectorState',
get: ({get}) => {
const testState = get(testState); // testState를 참조. 참조대상이 변하면 해당 함수 다시 실행
const unit = 'test';
return testState + unit;
},
});
위 코드에서 get은 계산될 함수다. 계산될 함수라는 말은 get에 전달될 인자를 통해 접근해야 할 대상이 정해지는 것이다. get의 인자를 통해 atoms와 다른 selectors에 접근 할 수 있다. 이 때 자동으로 종속 관계가 생성되어 참조했던 atoms나 selectors가 업데이트 되면 해당 함수도 다시 실행된다.// selector 호출
export const TestButton = () => {
const [testState, setTestState] = useRecoilState(testState);
const testSelectorState = useRecoilValue(testSelectorState); // selector
return (
...생략
);
};
selector는 useRecoilValue()를 통해 호출한다. 이유는 writable하지 않기 때문이다. useRecoilState()는 atoms에서 확인할 수 있듯이 setter를 반환한다. 하지만 selector는 명시적으로 set 함수를 설정하지 않으면 수정할 수 없는 상태가 된다.Recoil을 아주 기초만 다루어 보았지만 굉장히 유용하다는 생각이 들었던 동시에 프로젝트의 규모가 커지면 관리하기가 쉽지 않겠다는 생각도 같이 들었다. 그래서 개념부터 차근차근 들여다 보면서 천천히 익히려고 마음을 먹었던 것 같다.
사용해야하는 부분에 대한 파악을 명확히해서 프로젝트 내에서 공유 상태 관리로써 효율적인 사용이 가능토록 연습이 필요하다.
그럼 이만.👊🏽