Next.js
๋ฅผ ์ฌ์ฉํ ๋ ์ฆ, SSR
์ ํ๋ ๊ฒฝ์ฐ์ localstorage
์ ๋ณ์๋ฅผ ์ด์ฉํด์ svg
๋ฅผ ๋ ๋๋งํ ๋ ๋ฐ์ํ๋ ๊ฒฝ๊ณ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฒฐ๊ตญ SSR
์์ localstorage
์ ์ ๊ทผํ๋ ๊ฒ์ด ๋ฌธ์ ์ด๋ฏ๋ก ํด๋ผ์ด์ธํธ ์ธก์์ ๋ ๋๋ง ๋๋๋ก ๋ง๋ค๋ฉด ๊ฒฝ๊ณ ๊ฐ ์์ด์ง๋๋ค.
์๋ ์ฝ๋์ ํต์ฌ์
useEffect()
๋ฅผ ์ด์ฉํด์ ํด๋ผ์ด์ธํธ ์ธก์์ ๋ ๋๋ง ๋๊ณ ๋์ ์์ด์ฝ์ ๋ ๋๋งํ๋๋ก ์กฐ๊ฑด์ ๋ฃ์ด์ค ๊ฒ์ ๋๋ค.
const { theme, setTheme } = useTheme();
const [loaded, setLoaded] = useState(false);
useEffect(() => {
setLoaded(true);
}, [setLoaded]);
// jsx๋ถ๋ถ... ๋๋จธ์ง๋ ์๋ต
<button
type="button"
onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
className="w-10 h-10 rounded-full hover:bg-zinc-400 dark:hover:bg-slate-200 inline-flex justify-center items-center dark:hover:text-black"
>
{loaded ? (
<Icon
icon={theme === "dark" ? ICON.SUN : ICON.MOON}
$fill
className="w-7 h-7"
/>
) : (
<Icon icon={ICON.MOON} $fill className="w-7 h-7" />
)}
</button>