Recoil
recoil이란 mobx → redux → recoil 순서대로 페이스북에서 만든 상태 관리 라이브러리이다.angular같은 경우 부모 컴포넌트에서 자식 컴포넌트 사이의 props를 주고받기 편하게 되어있다.주고 받을 수는 있지만 코드가 굉장히 복잡해지고 어디서 어떤 data를 받았는지, 내려줬는지 일일히 다 체크해야한다. 그래서 이 문제를 해결하기위해 상태 관리 라이브러리가 나왔다.
그림1)
첫번째 그림은 최상단 컴포넌트가 X 내려받을 컴포넌트가 Y 라고 가정했을 때
X → Y 로 데이터가 전달 되려면 저렇게 내리고 내리고 내리고... 해야 값을 받을 수 있다
그림2)
하지만 두 번째의 네모 역할이 상태 관리 라이브러리이다. 장바구니, 샵 이라고도 많이 불린다.
필요한 data를 저곳에 넣어 놓고 어디서든 꺼내서 사용하면 된다.
위에 예시는 간단한 구조라 쉽겠지만 트리구조가 길어지면 복잡해져서 거의 99%는 상태 관리 라이브러리를 사용한다고 생각한다. ( 글쓴이의 생각 )
그럼이제 recoil을 알아보자.
Installation
CRA(npx create-react-app)로 리액트 파일을 생성한 후 아래 cli로 리코일을 설치한다.
npm i recoil // or yarn add recoil
RecoilRoot
리코일 state를 사용하는 컴포넌트들은 <RecoilRoot>를 필요로 한다. <RecoilRoot>를 사용하는 가장 좋은곳은 root component이다.
// app.js
import React from 'react';
import {
RecoilRoot,
atom,
selector,
useRecoilState,
useRecoilValue,
} from 'recoil'; // import!!! import하는것은 important하닌까 ~
function App() {
return (
<RecoilRoot> // 이렇게 감싸주어야한다.
<CharacterCounter />
</RecoilRoot>
);
}
Atom
아톰은 상태를 말하며 어떠한 컴포넌트에서 씌여지고 읽혀질 수 있다. 아톰의 va를 읽는 컴포넌트들은 암묵적으로 그 아톰에게 참고(subscribe)되어지고 있다. 그래서 아톰의 업데이트는 이 아톰을 참고하고 있는 컴포넌트를 리렌더 시킨다.
const textState = atom({
key: 'textState', // unique ID (다른 atoms/selectors을 구별하기 위해서)
default: '', // default value (aka initial value)
});
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>
);
}
Selector
셀렉터는 하나의 추출된 state다. '추출된(derived 또는 파생된)'이라는 의미는 state가 변경(transformation)된것을 의미한다. 다시 말해서 추출된 상태란, 주어진 상태를 변경(modify)시키는 순수 함수에 의해서 변경된 스테이트(the output)라고 말할 수 있다.(실제 상태를 변경시키지는 않는거 같다.)
// usage
const charCountState = selector({
key: 'charCountState', // unique ID (with respect to other atoms/selectors)
get: ({get}) => {
const text = get(textState);
return text.length;
},
});
function CharacterCount() {
const count = useRecoilValue(charCountState);
return <>Character Count: {count}</>;
}
간단하게
import React from 'react';
import countState from './Atoms';
import { useRecoilState,
useRecoilValue,
useSetRecoilState,
useResetRecoilState
} from 'recoil';
function Counter() {
const [counter, setCounter] = useRecoilState(countState);
// useState와 같지만, useRecoilState을 사용하여 다른 파일에 있는 아톰을 읽을 수 있다.
const currentCount = useRecoilValue(countState); // 읽기 전용!
const counterHandler = useSetRecoilState(countState); // 값만 변경 시키기
const resetCounter = useResetRecoilState(countState); // 디폴트값으로 값 변경
이정도 명령어만 알고있으면 좋을 것 같다.
뒤에 useRecoilState, useRecoilValue useSetRecoilState, useResetRecoilState 정도 알고있자.
recoil은 정말 hooks에 잘 맞게 나온 상태 라이브러리 같다.
틀린부분이 있으면 피드백 주시면 감사하겠습니다 :)
'React' 카테고리의 다른 글
Emotion 라이브러리란? (0) | 2021.12.29 |
---|---|
react animation? (0) | 2021.04.22 |
React Styled Component에 대해 알아보자! (0) | 2019.10.07 |
canvas 라이브러리 Fabric Demo (0) | 2019.09.20 |
CORS 란?! (0) | 2019.09.16 |