리액트

React Context

두캔두잇 2025. 1. 3. 16:27

상품 옵션들의 가격을 구하는 부분에서 해당하는 컴포넌트에 구현하였는데
Context를 통해 컴포넌트간에 값을 공유 할 수 있는 것을 알게되어 공부했다.

우선 Context란 무엇인가 하면

  • 컴포넌트간에 어떠한 값을 공유할 수 있게한다. 전역으로 필요한 값을 다룰 때 사용하는데, 그렇다고 꼭 전역적으로만 사용할 필요는 없다.

일반적으로는 부모컴포넌트에서 자식컴포넌트로 props를 통해 데이터를 전달하는데 context 를 만들어놓으면 데이터를 어떤 컴포넌트 트리에서도 쉽게 사용할 수 있는 장점이 있다.
그렇다면 어떻게 사용해야 할까?

1.Context 생성

    // UserContext.tsx
import React, { createContext, useContext, useState } from 'react';

// 사용자 정보의 타입 정의
interface User {
  name: string;
  age: number;
}

// Context의 타입 정의
interface UserContextType {
  user: User | null;
  setUser: (user: User) => void;
}

// Context 생성
const UserContext = createContext<UserContextType | undefined>(undefined);

// Provider 컴포넌트
export const UserProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
  const [user, setUser] = useState<User | null>(null); // 초기값은 null로 설정함

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

// Context를 사용하는 커스텀 훅
export const useUser = () => {
  const context = useContext(UserContext);
  if (!context) {
    throw new Error("useUser must be used within a UserProvider");
  }
  return context;
};

그리고 이 context를 사용하기 위해서는 사용하려는 컴포넌트들을 Provider로 감싸야한다.

2. Provider

    // App.tsx
import React from 'react';
import { UserProvider } from './UserContext';
import UserProfile from './UserProfile';

function App() {
  return (
    <UserProvider>
      <UserProfile />
    </UserProvider>
  );
}

export default App;

그 다음으로 context를 사용하기 위해 해당하는 컴포넌트에서 사용을 한다.

    // UserProfile.tsx
import React from 'react';
import { useUser } from './UserContext';

const UserProfile = () => {
  const { user, setUser } = useUser(); // Context에서 사용자 정보와 설정 함수를 가져온다.

  const handleLogin = () => {
    // 예시로 사용자 정보를 설정하는 함수
    setUser({ name: "홍길동", age: 30 });
  };

  return (
    <div>
      <h1>사용자 프로필</h1>
      {user ? (
        <div>
          <p>이름: {user.name}</p>
          <p>나이: {user.age}</p>
        </div>
      ) : (
        <p>로그인하지 않았습니다.</p>
      )}
      <button onClick={handleLogin}>로그인</button>
    </div>
  );
};

export default UserProfile;

내가 이해한대로 사용법을 정리한것인데 100% 맞다고는 할 수 없다. 다음에 context 를 통해 구현하면서 더 정확하게 다뤄봐야할 것 같다.

'리액트' 카테고리의 다른 글

Docker Container  (0) 2025.01.14
리눅스 명령어로 파일생성하기  (0) 2025.01.10
supabase  (1) 2025.01.02
react useHook - useRef  (0) 2025.01.01
프론트 FSD Pattern 에 대해서  (0) 2024.12.31