Syw.Frontend

✅ React 기초 강좌

6단계. 보너스 챕터

B-1-과제. B-1-과제

✅ localStorage에 다크모드 저장

  • 다크모드 상태(darkMode)를 localStorage에 저장
  • 앱이 새로 고침되거나 다시 켜져도 사용자의 테마 상태를 유지

📄 App.jsx - localStorage 연동 적용

import { useEffect, useState } from 'react';
import ThemeToggle from './components/ThemeToggle';
import './styles/theme.css';

function App() {
  // ✅ 1. 초기 상태를 localStorage에서 가져오기
  const [darkMode, setDarkMode] = useState(() => {
    const stored = localStorage.getItem('darkMode');
    return stored === 'true'; // 문자열 → boolean
  });

  // ✅ 2. 상태가 바뀔 때 localStorage에 저장
  useEffect(() => {
    localStorage.setItem('darkMode', darkMode);
  }, [darkMode]);

  return (
    <div className={darkMode ? 'dark' : 'light'}>
      <div className="app-container">
        <h1>🌗 다크모드 예제 (localStorage 적용)</h1>
        <ThemeToggle darkMode={darkMode} setDarkMode={setDarkMode} />
      </div>
    </div>
  );
}

export default App;

✅ 작동 방식 정리

단계 설명
1 useState(() => ...)로 초기 상태를 localStorage에서 읽음
2 useEffect로 상태가 바뀔 때마다 localStorage에 저장
3 새로 고침해도 상태가 유지됨

🧪 예시 테스트

  1. 브라우저에서 다크모드 전환 버튼 클릭
  2. 새로고침 해도 이전 상태 유지됨 (localStorage 확인 가능)

GitHub - heroyooi/react-app at bs1_resolve


✅ 다크모드 상태를 Context로 전역 관리하기

🎯 목표

항목 설명
상태 위치 DarkModeProvider에서 전역 관리
사용 방식 useDarkMode() 훅으로 접근
저장 방식 localStorage에 저장하여 새로고침 시 유지

📁 폴더 구조

src/
├── context/
│   └── DarkModeContext.jsx
├── components/
│   └── ThemeToggle.jsx
├── App.jsx
├── styles/theme.css

📄 1. context/DarkModeContext.jsx

import { createContext, useContext, useEffect, useState } from 'react';

const DarkModeContext = createContext();

export function DarkModeProvider({ children }) {
  const [darkMode, setDarkMode] = useState(() => {
    const stored = localStorage.getItem('darkMode');
    return stored === 'true';
  });

  useEffect(() => {
    localStorage.setItem('darkMode', darkMode);
  }, [darkMode]);

  return (
    <DarkModeContext.Provider value={{ darkMode, setDarkMode }}>
      {children}
    </DarkModeContext.Provider>
  );
}

// ✅ 사용용 커스텀 훅
export function useDarkMode() {
  return useContext(DarkModeContext);
}

📄 2. components/ThemeToggle.jsx

import { useDarkMode } from '../context/DarkModeContext';

function ThemeToggle() {
  const { darkMode, setDarkMode } = useDarkMode();

  return (
    <button onClick={() => setDarkMode(!darkMode)}>
      {darkMode ? '☀️ 라이트 모드' : '🌙 다크 모드'}
    </button>
  );
}

export default ThemeToggle;

📄 3. App.jsx

import { DarkModeProvider, useDarkMode } from './context/DarkModeContext';
import ThemeToggle from './components/ThemeToggle';
import './styles/theme.css';

function AppContent() {
  const { darkMode } = useDarkMode();

  return (
    <div className={darkMode ? 'dark' : 'light'}>
      <div className="app-container">
        <h1>🌗 다크모드 (Context 적용)</h1>
        <ThemeToggle />
      </div>
    </div>
  );
}

export default function App() {
  return (
    <DarkModeProvider>
      <AppContent />
    </DarkModeProvider>
  );
}

✅ 완성된 흐름

DarkModeProvider
└── AppContent
    ├── ThemeToggle (useDarkMode로 전역 상태 사용)
    └── 다른 컴포넌트에서도 사용 가능

🔍 장점

항목 설명
전역 공유 어느 컴포넌트든 다크모드 접근 가능
props 제거 더 이상 상태를 전달할 필요 없음
유지보수 ↑ 다크모드 로직이 한 곳에 집중됨

🧪 테스트 시나리오

  • ThemeToggle을 어디에 두든 다크모드 상태 작동해야 함
  • 새로고침해도 상태 유지되어야 함 (localStorage)
  • 다른 컴포넌트에서도 useDarkMode()로 접근 가능

GitHub - heroyooi/react-app at bs1_resolve2

💬 댓글

    ※ 로그인 후 댓글을 작성할 수 있습니다.