[React] recoil - atom 사용법

오트밀·2022년 2월 14일
0

darkmode, lightmode 테마를 적용하기 위해선 global state가 필요하다. 기존에는 한 파일에 theme state를 작성하고 그 state를 router에 전달한 후 router에서 다시 theme 적용이 필요한 파일 까지 theme state를 전송해 줬다.

현재는 적은 코드로 만드는 간단한 어플리케이션이기 때문에 꼬리에 꼬리를 무는 state 전달 방식이 큰 무리는 없지만 만약 코드가 길어지고 복잡해질 경우 state 전달만을 위해 유사한 코드를 복사 붙여넣기 하는 방법은 비효율적이다.

따라서 코드 복붙이 필요없는 theme 적용을 위해 recoil을 사용한다.
recoil은 일종의 bubble(Atom)을 만들어서 그 안에 공통적으로 사용해야하는 global variable과 state를 넣어놓는다. 만약 그 변수와 state가 필요하면 Atom을 연결해서 상태를 받아오거나 상태를 변화시킬수 있게 하는 라이브러리 이다.


먼저 npm install

npm install recoil

그리고 전역변수를 넣을 bubble(Atom) 파일을 만든다

atoms.ts

import { atom } from 'recoil';

export const isDarkAtom = atom({
  key: 'isDark',
  default: true,
});

App.ts

import { useRecoilValue } from 'recoil';
import { isDarkAtom } from './atoms';

...

function App() {
  const isDark = useRecoilValue(isDarkAtom);
  

bubble(Atom)이 필요한 파일에 recoil import, useRecoilValue로 atom.ts의 isDarkAtom을 사용한다고 선언하면 된다.

Coins.ts

import { isDarkAtom } from '../atoms';

...

function Coins() {
  const setDarkAtom = useSetRecoilState(isDarkAtom);
  const toggleDarkAtom = () => setDarkAtom((prev) => !prev);
  
  
  ...
  
  
   <button onClick={toggleDarkAtom}>Toggle Mode</button>

useSetRecoilState는 기존 isDarkAtom의 상태를 변화할수있는 함수이다. 기존 theme을 prev로 받고 Toggle Mode 버튼을 누르면 !prev로 상태를 바꿔서 버튼을 누르면 화면 전체의 theme을 바꾸게 된다.

profile
루틴을 만들자

0개의 댓글

관련 채용 정보