Prop 의 이동경로
// State Mangement 미사용
App -> Router -> Coin Screen -> Chart
// State Management 사용
App <- (isDark) -> Chart
버블(Bubble) 을 Recoil 에서는 아톰(Atom) 이라고 표현합니다.아톰은 컴포넌트에 종속되지 않고 어플리케이션 어느 곳엔가 있다.global state 를 어플리케이션의 분리된 공간에서 관리하는 것이 훨씬 나은 방법입니다.value 가 필요한 component 만 그 value 를 가진다는 것 입니다아톰은 어느 것이든 둘 수 있습니다.Recoil 세팅
npm install recoil or yarn add recoilindex.tsx 로 가서 React Query 를 사용하며 App 컴포넌트를 감싸 줬던 것처럼 RecoilRoot 컴포넌트로 감싸줍니다.// index.tsx
import React from "react";
import ReactDOM from "react-dom";
import { QueryClient, QueryClientProvider } from "react-query";
import { RecoilRoot } from "recoil";
import App from "./App";
const queryClient = new QueryClient();
ReactDOM.render(
<RecoilRoot>
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>
</RecoilRoot>,
document.getElementById("root")
);
Recoil 아톰 생성(Atom; Bubble)
src 폴더 안에 atoms.ts 파일을 생성합니다.
export const isDarkAtom 과 같이 변수를 선언해주고 atom({key: "isDark", default:false},) 와 같이 키값(유일한 값)과 디폴트값(초기값)을 할당해줍니다.
(import {atom} from "recoil";)
// atoms.ts
import { atom } from "recoil";
export const isDarkAtom = atom({
key: "isDark",
default: false,
});
App 컴포넌트 내에서 useRecoilValue function 을 사용합니다.useRecoilValue 에서 isDarkAtom을 매개변수로 사용합니다. useRecoilValue(isDarkAtom)const isDark = useRecoilValue(isDarkAtom) 을 작성해줍니다.isDark 변수 상태관리에 사용합니다.Chart 컴포넌트에서도 위와 같이 진행해줍니다.// App.tsx
import { useRecoilValue } from "recoil";
import { isDarkAtom } from "./atoms";
function App() {
const isDark = useRecoilValue(isDarkAtom);
return (
<>
<ThemeProvider theme={isDark ? darkTheme : lightTheme}>
<GlobalStyle />
<Router />
<ReactQueryDevtools initialIsOpen={true} />
</ThemeProvider>
</>
);
}atom을 수정할 component로 바로 이동하여 원하는 위치에 button 혹은 원하는 태그를 생성해줍니다.
value를 사용하기 위해 useRecoilValue 훅을 사용해줬던 것처럼 useSetRecoilState 를 사용하여 함수를 원하는 함수 이름의 변수에 선언, 할당 하여 줍니다.
(React의 setState와 같은 방식으로 작동합니다.)
button 태그에 onClick 이벤트 핸들러를 만들어 주고, 위에 useSetRecoilState를 사용하여 만들어줬던 함수 변수를 사용하여 해당 modifier function 으로 설정하고 싶은 값을 설정하여 주면 동작하고 간단한 Recoil 로 다크모드/라이트모드 기능 구현이 끝납니다.
// coins.tsx
function Coins({}: ICoinsProps) {
const setDarkAtom = useSetRecoilState(isDarkAtom);
const toggleDarkAtom = () => setDarkAtom((prev) => !prev);
const { isLoading, data } = useQuery<ICoin[]>("allCoins", fetchCoins); // hook
return (
<Container>
<Helmet>
<title>Coins</title>
</Helmet>
<Header>
<Title>Coins</Title>
<button onClick={toggleDarkAtom}>Toggle Mode</button>
</Header>
...
Recoil을 이용한 Prop의 경로
coins 컴포넌트의 Header 컴포넌트에서 isDark의 상태 설정App, Chart 컴포넌트는 atoms.ts에서 한 번에 가져와서 상태 적용// 간단한 다크모드/라이트모드
Coins -> (isDark)
App <- (isDark) -> Chart
다음 글에서는 간단한 To-Do List 를 작성하며 Recoil, State Management 라이브러리에 대해 더 공부해보겠습니다.