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 recoil
index.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 라이브러리에 대해 더 공부해보겠습니다.