React, Context + Consumer

2024. 12. 26. 15:07웹 개발

App.js

import React from 'react';
import { UserProvider } from './UserContext';
import { ThemeProvider } from './ThemeContext';
import MainComponent from './MainComponent';
import ConsumerComponent from './ConsumerComponent';

// App 컴포넌트
// 여러 Context Provider를 중첩하여 사용
const App = () => {
  return (
    <UserProvider>
      <ThemeProvider>
        <MainComponent />
        <ConsumerComponent /> // 추가
      </ThemeProvider>
    </UserProvider>
  );
};

export default App;

 

+ ConsumerComponent.js

// ConsumerComponent.js
import React from "react";
import { UserContext } from "./UserContext";
import { ThemeContext } from "./ThemeContext";

const ConsumerComponent = () => {
    return (
        <UserContext.Consumer>
            {({ user }) => (
                <ThemeContext.Consumer>
                    {({ theme }) => (
                        <div
                            style={{
                                border: "1px solid",
                                padding: "10px",
                                margin: "10px",
                                background:
                                    theme === "light" ? "#f9f9f9" : "#444",
                                color: theme === "light" ? "#000" : "#fff",
                            }}
                        >
                            <h2>ConsumerComponent</h2>
                            <p>사용자 이름: {user.name}</p>
                            <p>사용자 나이: {user.age}</p>
                            <p>현재 테마: {theme}</p>
                        </div>
                    )}
                </ThemeContext.Consumer>
            )}
        </UserContext.Consumer>
    );
};

export default ConsumerComponent;

 

 

UserContext.js

import React, { createContext, useState } from "react";

// 사용자 정보 관리를 위한 Context
export const UserContext = createContext();

export const UserProvider = ({ children }) => {
    const [user, setUser] = useState({ name: "홍길동", age: 25 });

    return (
        <UserContext.Provider value={{ user, setUser }}>
            {children}
        </UserContext.Provider>
    );
};

 

ThemeContext.js

import React, { createContext, useState } from "react";

// 테마 정보 관리를 위한 Context
export const ThemeContext = createContext();

export const ThemeProvider = ({ children }) => {
    const [theme, setTheme] = useState("light");

    return (
        <ThemeContext.Provider value={{ theme, setTheme }}>
            {children}
        </ThemeContext.Provider>
    );
};

 

MainComponent.js

// MainComponent.js
import React, { useContext } from "react";
import { UserContext } from "./UserContext";
import { ThemeContext } from "./ThemeContext";

const MainComponent = () => {
    const { user, setUser } = useContext(UserContext); // UserContext 사용
    const { theme, setTheme } = useContext(ThemeContext); // ThemeContext 사용

    return (
        <div style={{
                background: theme === "light" ? "#fff" : "#333",
                color: theme === "light" ? "#000" : "#fff",
            }}
        >
            <h1>안녕하세요, {user.name}님!</h1>
            <p>현재 나이: {user.age}</p>
            <button onClick={() => setUser({ name: "김영희", age: 30 })}>
                사용자 변경
            </button>
            <br />
            <button onClick={() => setTheme(theme === "light" ? "dark" : "light")}>
                테마 변경 (현재: {theme})
            </button>
        </div>
    );
};

export default MainComponent;

 

https://stackblitz.com/edit/vitejs-vite-vanzyauk?embed=1&file=src%2FApp.jsx

'웹 개발' 카테고리의 다른 글

React, Redux  (1) 2024.12.26
React, Context, useContext Hook  (1) 2024.12.26
React, usePromise 커스텀 훅  (0) 2024.12.23
React, Axios  (0) 2024.12.23
Javascript, Async / Await  (2) 2024.12.20