Recoil로 UI 테마 전환을 구현하는 방법은 무엇입니까?
NOTE: This tutorial is relevant to developers using a CSS-in-JS styling approach, e.g. Emotion.js, Material UI, etc.
1단계: 현재 선택한 테마 이름에 Recoil atom 사용
import { PaletteMode } from "@mui/material";
import { atom } from "recoil";
export const ThemeName = atom<PaletteMode>({
key: "ThemeName",
effects: [/* ... */]
});
2단계: 현재 선택한 테마 개체에 반동 선택기 사용
import { createTheme } from "@mui/material";
import { selector } from "recoil";
export const Theme = selector({
key: "Theme",
dangerouslyAllowMutability: true,
get(ctx) {
const name = ctx.get(ThemeName);
return createTheme(/* ... */);
},
});
3단계: useTheme() , useToggleTheme() React 후크 추가
import { useRecoilValue, useRecoilCallback } from "recoil";
export function useTheme() {
return useRecoilValue(Theme);
}
export function useToggleTheme() {
return useRecoilCallback(
(ctx) => () => {
ctx.set(ThemeName, (prev) => (prev === "dark" ? "light" : "dark"));
},
[]
);
}
4단계: 현재 선택한 테마 이름을 localStorage에 저장/복원
export const ThemeName = atom<PaletteMode>({
key: "ThemeName",
effects: [
(ctx) => {
const storageKey = "theme";
if (ctx.trigger === "get") {
const name: PaletteMode =
localStorage?.getItem(storageKey) === "dark"
? "dark"
: localStorage?.getItem(storageKey) === "light"
? "light"
: matchMedia?.("(prefers-color-scheme: dark)").matches
? "dark"
: "light";
ctx.setSelf(name);
}
ctx.onSet((value) => {
localStorage?.setItem(storageKey, value);
});
},
],
});
5단계: 최상위 React 구성 요소에 ThemeProvider 추가
import { ThemeProvider } from "@mui/material";
import { useTheme } from "../theme/index.js";
function App(): JSX.Element {
const theme = useTheme();
return (
<ThemeProvider theme={theme}>
{/* ... */}
</Theme>
);
}
app/theme/index.ts
의 React Starter Kit 참조자원
Reference
이 문제에 관하여(Recoil로 UI 테마 전환을 구현하는 방법은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/koistya/how-to-use-recoil-for-ui-theme-switching-18id텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)