React의 useContext는 React의 컴포넌트 간 데이터를 전달하는 방법 중 하나로, 컴포넌트 계층 구조에서 상위에서 하위로 데이터를 전달하는 것이 아닌, 특정한 컴포넌트에서 createContext로 생성한 Context 객체를 이용하여 하위 컴포넌트에서 필요한 데이터를 전달하는 방법입니다.
이를 이용하여 Provider 컴포넌트에서 value를 설정하고, Consumer 컴포넌트에서 해당 값을 사용할 수 있습니다. 이를 통해 컴포넌트 간의 중첩이 깊어지더라도 특정 값을 전달하기 위해 props를 계속해서 넘겨줄 필요가 없어 코드의 가독성이 향상됩니다.
useContext는 주로 전역 상태를 관리하는 것에 사용됩니다. 예를 들어, 로그인 정보나 애플리케이션 설정과 같이 많은 컴포넌트에서 공유되어야 하는 데이터를 관리할 때 유용합니다.
다크 모드 설정 - context를 사용하지 않는 예제 */
const { useState } = React;
function Header(props){
return(
<header
className="header"
style={
{
backgroundColor : props.isDark? 'black' : 'lightgray',
color : props.isDark? 'white' : 'black'
}
}
>
<h1>Welcome to Greedy World!</h1>
</header>
);
}
function Content({isDark}){
return(
<div
className="content"
style={
{
backgroundColor : isDark? 'black':'white',
color : isDark? 'white' : 'black'
}
}
>
<p>내용입니다</p>
</div>
);
}
function Footer({isDark, setIsDark}){
const toggleHandler = () => setIsDark(!isDark);
return (
<footer
className = "footer"
style={
{
backgroundColor : isDark? 'black' : 'lightgray',
color : isDark? 'white' : 'black'
}
}
>
<button onClick={toggleHandler}>{ isDark? 'LightMode' : 'DarkMode'}</button>
Copyright 2023. team-greedy. all rights reserved.
</footer>
);
}
function Page({isDark, setIsDark}){
return (
<div className='page'>
<Header isDark={isDark}/>
<Content isDark={isDark}/>
<Footer isDark={isDark} setIsDark={setIsDark}/>
</div>
);
}
function App(){
const [isDark, setIsDark ] = useState(false);
return <Page isDark = {isDark} setIsDark = { setIsDark }/>;
}
ReactDOM.createRoot(document.getElementById('root')).render(<App/>);
const DarkModeContext = createContext(null);
function Header(){
const context = useContext(DarkModeContext);
const {isDark} = context;
return(
<header
className="header"
style={
{
backgroundColor : isDark? 'black' : 'lightgray',
color : isDark? 'white' : 'black'
}
}
>
<h1>Welcome to Greedy World!</h1>
</header>
);
}
function Content(){
const context = useContext(DarkModeContext);
const {isDark} = context;
return(
<div
className="content"
style={
{
backgroundColor : isDark? 'black':'white',
color : isDark? 'white' : 'black'
}
}
>
<p>내용입니다</p>
</div>
);
}
function Footer(){
const context = useContext(DarkModeContext);
const {isDark, setIsDark} = context;
const toggleHandler = () => setIsDark(!isDark);
return (
<footer
className = "footer"
style={
{
backgroundColor : isDark? 'black' : 'lightgray',
color : isDark? 'white' : 'black'
}
}
>
<button onClick={toggleHandler}>{ isDark? 'LightMode' : 'DarkMode'}</button>
Copyright 2023. team-greedy. all rights reserved.
</footer>
);
}
function Page(){
return (
<div className='page'>
<Header />
<Content />
<Footer />
</div>
);
}
function App(){
const [ isDark, setIsDark ] = useState(false);
/* provier는 context를 구독하고 있는 컴포넌트들에게 context의 변화를 알리는 역할을 한다.
Provider는 valeu prop 을 이용하여 하위 컴포넌트에게 값을 전달한다.
이 때 값을 전달 받을 수 있는 컴포넌트 수에는 제한이 없다.
prop 하위에서 context를 구독하는 모든 컴포넌트는 value prop이 바뀔 때마다 다시 랜더링 된다. */
return (
<DarkModeContext.Provider value={{isDark, setIsDark}}>
<Page/>
</DarkModeContext.Provider>
)
}
ReactDOM.createRoot(document.getElementById('root')).render(<App/>);