리액트에는 내장된 내부 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