Recoil을 이용하여 state를 관리하고 다크모드를 만들자!!
npm install recoil
ReactDOM.render(
<React.StrictMode>
<RecoilRoot>
{/* // Provide the client to your App */}
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>
</RecoilRoot>
</React.StrictMode>,
document.getElementById("root")
);
atom()
을 사용하여 state를 집어넣을 공간을 만들어준다.import { atom } from "recoil";
export const isDarkAtom = atom({
//state 이름(고유)
key:"isDark",
// 기본값
default: false,
})
useRecoilValue
: atom의 state을 불러옴function App() {
const isDark = useRecoilValue(isDarkAtom);
return (
<>
<ThemeProvider theme={isDark ? darkTheme : lightTheme}>
<GlobalStyle />
<Router />
<ReactQueryDevtools initialIsOpen={true} />
</ThemeProvider>
</>
);
}
isDark
가 true면 다크모드 / false면 라이트모드useSetRecoilState
: atom의 state 값을 바꿀 수 있음 (Usestate()
의 Setfn을 떠올리면 된다)function App() {
const isDark = useRecoilValue(isDarkAtom);
const setDarkAtom = useSetRecoilState(isDarkAtom);
const toggleDark = () => setDarkAtom ((prev) => !prev);
return (
<>
<ThemeProvider theme={isDark ? darkTheme : lightTheme}>
<button onClick={toggleDark}>toggle Mode</button>
<GlobalStyle />
<Router />
<ReactQueryDevtools initialIsOpen={true} />
</ThemeProvider>
</>
);
}
isDark
의 값이 정반대로 바뀌도록 함수 작성useRecoilValue
, useSetRecoilState
를 이용해 꺼내 쓸 수 있음Chart.tsx
에도 isDark
atom을 사용하여 ApexChart의 모드를 바꿀 수 있도록 해봤음function Chart({ coinId }: ChartProps) {
const isDark = useRecoilValue(isDarkAtom);
...
return(
...
<ApexChart
type="line"
series={[
{
name: "Price",
data: data?.map((price) => price.close),
},
]}
options={{
theme: {
mode: isDark ? "dark" : "light",
},
...
Recoil 공식문서(한국어) - https://recoiljs.org/ko/docs/introduction/installation
React JS 마스터클래스 - 노마드코더 https://nomadcoders.co/react-masterclass
나중에 더 배우면 추가하겠음