리액트에는 내장된 내부 state 저장소가 있습니다.이를 react context라고 합니다.
- Props가 많은 컴포넌트를 통해 많은 데이터를 전달하는 경우 예기치 못한 문제를 방지할 수 있습니다.
 
auath-context.js
import React from 'react'
const AuthContext = React.createContext({
  isLoggedIn: false,
})
첫번째: 컴포넌트를 공급
<AuthContext.Provider>로 감싼 하위 컴포넌트 모두 context API사용이 가능합니다.ex) MainHeader, Login컴포넌트에서 context API가 필요한 경우
import AuthContext from './components/store/auth-context'
return (
  <AuthContext.Provider
    value={{
      isLoggedIn: isLoggedIn,
    }}
  >
    <MainHeader /*isAuthenticated={isLoggedIn}더이상필요하지 않음*/
      onLogout={logoutHandler}
    />
    <main>
      {!isLoggedIn && <Login onLogin={loginHandler} />}
      {isLoggedIn && <Home onLogout={logoutHandler} />}
    </main>
  </AuthContext.Provider>
)
AuthContext 그 자체로는 컴포넌트가 아니기에 react의 Provider속성을 이용합니다.value={}라는 프롭을 가져야합니다.두번째 hook을 연결하고 관찰해야합니다.
listening의 경우 custom 또는 react hook을 이용해 할 수 있습니다.
<AuthContext.Consumer>
  {(ctx) => {
    return (
      <nav className={classes.nav}>
        <ul>
          {props.isLoggedIn && (
            <li>
              <a href="/">Users</a>
            </li>
          )}
          {props.isLoggedIn && (
            <li>
              <a href="/">Admin</a>
            </li>
          )}
          {props.isLoggedIn && (
            <li>
              <button onClick={props.onLogout}>Logout</button>
            </li>
          )}
        </ul>
      </nav>
    )
  }}
</AuthContext.Consumer>
{(cxt) => { retrun }} 함수를 호출합니다.import React, { useContext } from 'react'
const Navigation = (props) => {
  const ctx = useContext(AuthContext)
  return (
    <nav className={classes.nav}>
      <ul>
        {ctx.isLoggedIn && (
          <li>
            <a href="/">Users</a>
          </li>
        )}
    ...
  )
<AuthContext.Consumer>태그로 한번 감싸준 후 그 안에서{(cxt) => { retrun }} 함수를 호출했던 과정을 줄여줍니다.사용하는 쪽
  <AuthContext.Provider
    value={{
      isLoggedIn: isLoggedIn,
      onLogout: logoutHandler
    }}
  >
auth-context
const AuthContext = React.createContext({
  isLoggedIn: false,
  onLogout: () => {},
})
만약, auth-context에 더 많은 로직을 가져와 사용을 하고 싶은 경우에는 어떻게 해야할까요?
즉, 별도의 컨텍스트 관리 컴포넌트를 만들고싶은 경우에는 어떻게 해야할까요?
이런 경우 auth-context파일 내에서 AuthContextProvider라는 하나의 컴포넌트를 만들 수 있습니다.
auth-context
...
export const AuthContextProvider = (props) => {
  return <AuthContext.Provider>{props.children}</AuthContext.Provider>
}
export default AuthContext
위와 같이 props를 받아와 들어온 모든 것을 전달할 수 있습니다. 또한 AuthContext뿐만 아니라 AuthContextProvider도 내보내줍니다.
이렇게 props를 받는 하나의 컴포넌트를 만들어준다면 App.js에서 만든 긴 코드를 App.js에서 분리를 해 사용을 할 수 있습니다. 이렇게 프로젝트를 중앙집중적인 접근방식으로 변경할 수 있습니다.
auth-context
import React, { useState } from 'react'
const AuthContext = React.createContext({
  isLoggedIn: false,
  onLogout: () => {},
  onLogin: (email, password) => {},
})
export const AuthContextProvider = (props) => {
//App.js에서 사용하던 로직을 가져옵니다.
  const { isLoggedIn, setIsLoggedIn } = useState(false)
  const logoutHandler = () => {
    setIsLoggedIn(false)
  }
  const loginHandler = () => {
    setIsLoggedIn(true)
  }
  return (
    <AuthContext.Provider
      value={{
        isLoggedIn: isLoggedIn,
        onLogout: logoutHandler,
        onLogIn: loginHandler,
      }}
    >
      {props.children}
    </AuthContext.Provider>
  )
}
export default AuthContext