[TIL/Coin Site Project] 2023/11/30

์›๋ฏผ๊ด€ยท2023๋…„ 11์›” 30์ผ

Coin Site Project

๋ชฉ๋ก ๋ณด๊ธฐ
5/31
post-thumbnail

Dark Mode ์Šต์ž‘ ๐ŸŒ–

import React, { createContext, useContext, useMemo, useState } from "react";
import IconButton from "@mui/material/IconButton";
import Box from "@mui/material/Box";
import { useTheme, ThemeProvider, createTheme } from "@mui/material/styles";
import Brightness4Icon from "@mui/icons-material/Brightness4";
import Brightness7Icon from "@mui/icons-material/Brightness7";

const ColorModeContext = createContext({ toggleColorMode: () => {} });

function MyApp() {
  console.log("MyApp component rendering");
  const theme = useTheme();
  const colorMode = useContext(ColorModeContext);

  return (
    <Box
      sx={{
        display: "flex",
        width: "100%",
        height: "100vh",
        alignItems: "center",
        justifyContent: "center",
        bgcolor: "background.default",
        color: "text.primary",
        borderRadius: 1,
        p: 3,
      }}
    >
      {theme.palette.mode} mode
      <IconButton
        sx={{ ml: 1 }}
        onClick={colorMode.toggleColorMode}
        color="inherit"
      >
        {theme.palette.mode === "dark" ? (
          <Brightness7Icon />
        ) : (
          <Brightness4Icon />
        )}
      </IconButton>
    </Box>
  );
}

const ToggleColorMode = () => {
  console.log("ToggleColorMode component rendering");
  const [mode, setMode] = useState("light");

  const colorMode = useMemo(
    () => ({
      toggleColorMode: () => {
        console.log("toggleColorMode executed");
        setMode((prevMode) => (prevMode === "light" ? "dark" : "light"));
      },
    }),
    []
  );
  console.log("theme executed 1");
  const theme = useMemo(
    () =>
      createTheme({
        palette: {
          mode,
        },
      }),
    [mode]
  );
  console.log("theme executed 2");
  return (
    <ColorModeContext.Provider value={colorMode}>
      <ThemeProvider theme={theme}>
        <MyApp />
      </ThemeProvider>
    </ColorModeContext.Provider>
  );
};

export default ToggleColorMode;

// what is createContext?
// ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์•ˆ์—์„œ ์ „์—ญ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ ์•ˆ๋œ ๋ฐฉ๋ฒ•?
// ColorModeContext๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ๋Š” toggleColorMode๋ฅผ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์˜ ์ฝ”๋“œ?

// what is useTheme?
// ์•„๋ž˜ ์ฝ”๋“œ์—์„œ theme์€, mui์—์„œ ๋‹ค์–‘ํ•œ theme์„ ๊ทœ์ •ํ•ด๋†“์€ ํ•˜๋‚˜์˜ ํ›…์ด๋‹ค.

// what is useContext?
// useContext๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ปจํ…์ŠคํŠธ์˜ ํ˜„์žฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์˜ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

// what is useMemo?
// ์ปดํฌ๋„ŒํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์‚ฌ์šฉ๋˜๋Š” react hook
// ๋ Œ๋”๋ง => ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ํ˜ธ์ถœ => memoize๋œ ํ•จ์ˆ˜ ์žฌ์‚ฌ์šฉ(๋™์ผํ•œ ๊ณ„์‚ฐ ๋ฐ˜๋ณตํ•  ๋•Œ ์‚ฌ์šฉ)

// what is ThemeProvider?
// ์ „์—ญ์œผ๋กœ ํ…Œ๋งˆ๋ฅผ ์ ์šฉ๋  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ

// what is createTheme?
// ํ…Œ๋งˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜

์ƒˆ๋กœ๊ณ ์นจ console ์ˆœ์„œ

  1. ToggleColorMode component rendering
  2. theme executed 1
  3. theme executed 2
  4. MyApp component rendering

๋ชจ๋“œ ์•„์ด์ฝ˜ ํด๋ฆญ console ์ˆœ์„œ

  1. toggleColorMode executed
  2. ToggleColorMode component rendering
  3. theme executed 1
  4. theme executed 2
  5. MyApp component rendering

+) toggleColorMode executed ์ดํ›„ setState()์— ์˜ํ•ด re-rendering์ด ๋œ๋‹ค๋Š” ์ ์ด '์•„์ด์ฝ˜ ํด๋ฆญ console'์—์„œ ์ฃผ๋ชฉํ•  ์‚ฌํ•ญ์ด๋‹ค.

+) createContext, useContext, useMemo => ๋ฆฌ์•กํŠธ ๊ณต์‹๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ์ •๋ฆฌํ•ด์•ผ ๋  ํ•„์š”์„ฑ์„ ๋А๊ผˆ๋‹ค.

+) ๋ณธ ํ”„๋กœ์ ํŠธ์—๋Š” ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•  ํ•„์š”์„ฑ์„ ๋А๊ผˆ๋‹ค.

๊ตฌํ˜„ ๐ŸŒ–

profile
Write a little every day, without hope, without despair โœ๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€