: 데이터를 props형태로 계승하는 것이 아니라 전역적으로 관리하는 방법
: 여러 Component에서 접근해야 하는 데이터를 관리할때 주로 사용합니다.
: context를 생성하기 위해 사용합니다.
// JSX const UserContext = React.createContext(기본값);
: Provider로 감싸진 하위 components는 context에 접근이 가능해집니다.
// JSX const UserContext = React.createContext({ name: 'Guest', }); function App() { const [user, setUser] = useState({name: 'John'}); <UserContext.Provider value={user}> <Layout /> </UserContext.Provider> }
user
의 기본값을 {name: 'John'}
으로 변경해서 전달합니다. user
state의 값을 로그인 성공시에 할당하도록 설정하면 {name: 'Guest'}
을 기본값으로 사용하고 후에 변경하도록 설정할 수 있습니다.// JSX function App() { <UserContext.Provider value={{name: 'John'}}> <Layout /> </UserContext.Provider> }
value를 위와 같이 작성하게되면 Provider가 재렌더링 될 때 마다 value 객체가 재 생성되어 context를 사용하는 하위 컴포넌트가 모두 재렌더링 됩니다.
=> value값을 state로 관리하여 불필요한 재렌더링을 방지합니다.
// JSX const ThemeContext = React.createContext('light'); const UserContext = React.createContext({ name: 'Guest', }); function App() { const [user, setUser] = useState({name: 'John'}); const [theme, setTheme] = useState(); <ThemeContext.Provider value={theme} > <UserContext.Provider value={user}> <Layout /> </UserContext.Provider> </ThemeContext.Provider> }
: context를 사용하기 위해 사용합니다.
// JSX <UserContext.Consumer> {value => ( // 렌더링할 component )} </UserContext.Consumer>
// JSX function Content() { return ( <ThemeContext.Consumer> {theme => ( <UserContext.Consumer> {user => ( <Profile user={user} theme={theme}> )} </UserContext.Consumer> )} </ThemeContext.Consumer> ); }
: context.Consumer
의 역할을 간편하게 사용하기 위해 사용됩니다.
// JSX function Profile() { const theme = useContext(ThemeContext); const user = useContext(UserContext); return ( ~~ ); }
styled-components
에서만 props의 사용이 필요한경우 ThemeProvider
라는 객체의 사용이 편리할 수 있습니다.
import { ThemeProvider } from "styled-components"; function App() { const theme = { ~~~ } return ( <ThemeProvider theme={theme}> <Wrap /> </ThemeProvider> ); }
위와 같이 context와 비슷하게 사용하며 context와 다른점은
const Main = styled.div` color: ${props => props.theme.color}; `; function Component(props) { return( <> <Main // color={props.theme.color} -> 사용 불가 /> ~~~ </> ); }
위와 같이 Component
의 작성부에서는 사용 자체가 안되지만
styled
에서는 Component
가 넘겨준 값이 없어도 바로 사용된다는 장점이 있습니다.