본문 바로가기

Front-End/React

Context API

어떤 상태(state)를  전체적으로 공유하기 위함이다.

 

3가지만 기억하면 된다.

1.createContext 만들기

2.Provider(껍데기) 만들기

3.내가 쓸 곳에 씌워주기.

 

1.createContext 만들기

const UserContext = createContext<타입>(초기값)

 

 

2.껍데기 만들기

export default function AtuhProvider({children} : {children : Type}) 
{
안에서 state와 state함수 
return ( <껍데기> {children} </껍데기> )
}

 

3.내가 쓸 곳에 놓기.

//app.tsx

<AuthProvider> <route 어쩌구> <AuthProvider/>

 

 

 

 

심화적으로 보겠다.

import { createContext, useState } from "react";
import getAuthDataFromLocalStorage from "../pages/login/get_auth_from_local/get_auth_from_local";
import { AuthData } from "../type/user";

interface UserContextType {
  userInfo: AuthData | null;
  setUserInfo: React.Dispatch<React.SetStateAction<AuthData | null>>;
}

export const UserContext = createContext<UserContextType>({
  userInfo: null,
  setUserInfo: () => {},
});

// AuthProvider를 생성합니다.
export default function AuthProvider({
  children,
}: {
  children: React.ReactNode;
}) {
  // useState 훅을 사용하여 상태를 관리합니다.
  const [userInfo, setUserInfo] = useState<AuthData | null>(
    getAuthDataFromLocalStorage(),
  );

  return (
    // UserContext.Provider를 사용하여 전역 상태를 설정합니다.
    <UserContext.Provider value={{ userInfo, setUserInfo }}>
      {children}
    </UserContext.Provider>
  );
}

 

 

 

컨텍스트 APi에 단점도 물론 존재한다.

1.불필요한 리렌더링

2.컴포넌트의 재사용성 저하

3.상태 관리의 복잡성 증가

4.디버깅 어려움

5.의존성 관리 문제

 

나중에 useMemo를 사용해서 메모이제이션도 쓸 수 있다.

 

 

 

 

 

 

 

//부록

//로컬스토리지에서 유저정보를 가져오는 함수


import { AuthData } from "../../../type/user";

export default function getAuthDataFromLocalStorage(): AuthData | null {
  let isAuth = true;
  const result = {
    id: localStorage.getItem("id"),
    nickname: localStorage.getItem("nickname"),
    refresh: localStorage.getItem("refresh"),
    access: localStorage.getItem("access"),
  };
  Object.keys(result).forEach((key) => {
    if (result[key as keyof AuthData] === null) {
      isAuth = false;
    }
  });
  return isAuth ? result : null;
}

'Front-End > React' 카테고리의 다른 글

병렬 패칭 , Suspense  (0) 2024.07.30
서버 띄우는법 , http통신  (0) 2024.07.26
메모이제이션  (1) 2024.07.26
리액트 불변성  (0) 2024.07.25
코드분석(To-do-list)  (3) 2024.07.24