Context
๋ชจ๋ ์ปดํฌ๋ํธ์์ ๊ณต์ ํ ์ ์๋ ์ํ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ
Context ์ ํ์์ฑ
Context ๋ ๋ชจ๋ ์ปดํฌ๋ํธ์์ ์ํ๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ํ์ํฉ๋๋ค.
- ์์ ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ ์ ๋ฌํด์ผํ๋ ๊ฒฝ์ฐ
- ์ปดํฌ๋ํธ 2๊ณ์ธต ์ด์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผํ๋ ๊ฒฝ์ฐ
์ํ๋ฅผ ๊ด๋ฆฌํ๋ค ๋ณด๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ ๋จ๋ฐฉํฅ์ผ๋ก๋ง ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ์ฐ ์ธ์๋ ์์์์ ๋ถ๋ชจ๋ก, ๋๋ ์ปดํฌ๋ํธ ์ฌ๋ฌ ๊ณ์ธต์ ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋, Global State ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ ๋จ์ ์ด ์์ต๋๋ค.
โข
Global State๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค. ๋ํ, Global State ์ ๋ํ ์ ๊ทผ์ ์ ์ดํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
โข
๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ์ ๊ฒฐํฉ๋๊ฐ ๋์์ง ์ ์์ต๋๋ค. ๋ํ, ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์์ ์ปดํฌ๋ํธ๋ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
ํ์ง๋ง, React Context ๋ฅผ ๋์
ํ๋ฉด ์ด๋ฌํ ๋จ์ ์ ํด๊ฒฐํ ์ ์์ต๋๋ค. React Context ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค.
โข
๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๊ณต์ ํ ์ ์์ต๋๋ค.
โข
์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋๋ค.
โข
์ ์ง ๊ด๋ฆฌ๊ฐ ์ฝ์ต๋๋ค.
Context vs Props
์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋๋, props ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ด๋ ๊ฒ ๋จ์ํ 1๊ณ์ธต ์ ๋์ ๊ด๊ณ์์๋ props ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ฐ๋จํ๊ฒ ์ง๋ง, 2๊ณ์ธต, 3๊ณ์ธต.. .N๊ณ์ธต ์ด์์ผ๋ก ์ปดํฌ๋ํธ๊ฐ์ ๋ฐ์ดํฐ ์ ๋ฌ์ด ํ์ํ๋ค๋ฉด, ๊ณ์์ ์ผ๋ก props ๋ฅผ ๋ด๋ ค์ฃผ๊ฒ ๋์ด ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ณ ์ ์ง๋ณด์์ฑ์ด ๋จ์ด์ง๋๋ค.
์ด๋ฌํ ์ ์ ๋ณด์ํ๊ธฐ ์ํ ๊ฐ๋
์ด ๋ฐ๋ก Context ์
๋๋ค.
์ปจํ
์คํธ๋ฅผ ์ฌ์ฉํ๋ฉด, ์์ ์ปดํฌ๋ํธ์์ ํ ๊ณ์ธต์ฉ ๊ณ์์ ์ผ๋ก props ๋ฅผ ๋ด๋ฆด ํ์์์ด ๋ชจ๋ ์ปดํฌ๋ํธ์์ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ์ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด, props ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ด๋ฆด ํ์์์ด ์ฝ๋๋ ๊ฐ๊ฒฐํด์ง๊ณ ์ ์ง๋ณด์์ฑ๋ ์ฌ๋ผ๊ฐ๋๋ค.
Context ์ฌ์ฉ ๋ชฉ์
์ปจํ
์คํธ๋ ๋ชจ๋ ์ปดํฌ๋ํธ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ์ ์๋ ๊ฐ๋
์
๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๊ณตํต์ ์ ์ฌ์ฉํ๊ฑฐ๋ ์์ฃผ ์ฌ์ฉํด์ผํ๋ ๋ฐ์ดํฐ์ ์ ํฉํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด, ๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ก๊ทธ์ธ ์ ๋ณด ๋ฑ์ด ์๊ฒ ์ต๋๋ค. ๋ํ, ํ์ด์ง ์ด๋์ ์ฌ๋ฌ ๋ฒ ํ๋ฉด์ ์ฌ์ฉ์๋ก๋ถํฐ ์กฐ๊ธ์ฉ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅ๋ฐ๋ UI ์ ๊ฒฝ์ฐ์๋, ๋งค๋ฒ ํ์ด์ง ์ด๋ํ๋ฉด์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ธธ ํ์ ์์ด ์ปจํ
์คํธ๋ฅผ ์ด์ฉํด๋ ์ข๊ฒ ์ต๋๋ค.
Context ์ฃผ์ ๊ฐ๋
Provider
: Context๋ฅผ ์ ๊ณตํ๋ ์ปดํฌ๋ํธ์
๋๋ค.
Consumer
: Context์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ปดํฌ๋ํธ์
๋๋ค.
Context Value
: Context์์ ์ ๊ณตํ๋ ๋ฐ์ดํฐ์
๋๋ค.
React Context ์ ์ฉ๊ณผ์
React Context ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์งํํฉ๋๋ค.
1.
Context ๋ฅผ ์์ฑํฉ๋๋ค.
2.
Providerย ์ปดํฌ๋ํธ๋ฅผ ์ ์ํฉ๋๋ค.
3.
Context ๋ฅผ ์ ๋ฌ๋ฐ์ ์ฌ์ฉํ ์ปดํฌ๋ํธ๋ค์ ์ ์๋ Provider ๋ฅผ ํตํด ์ง์ ํฉ๋๋ค.
4.
Consumerย ์ปดํฌ๋ํธ ๋๋ useContext ์ฌ์ฉํ์ฌ Context ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๋ฌธ๋ฒ
โข
Context ์์ฑ
โข
Provider ์ปดํฌ๋ํธ ์ ์
โข
Provider ์ ์ฉ
โข
Consumer ์ปดํฌ๋ํธ ์ฌ์ฉ
Context ์์ฑ
โข
๊ธฐ๋ณธ ๋ฌธ๋ฒ
import { createContext } from 'react';
const ์ปจํ
์คํธ์ด๋ฆ = createContext(๊ธฐ๋ณธ๊ฐ);
JavaScript
๋ณต์ฌ
import React from 'react';
const ์ปจํ
์คํธ์ด๋ฆ = React.createContext(๊ธฐ๋ณธ๊ฐ);
JavaScript
๋ณต์ฌ
โข
MyContext.jsx
import { createContext } from 'react';
const MyContext = createContext();
export default MyContext;
JavaScript
๋ณต์ฌ
Provider ์ปดํฌ๋ํธ ์ ์
Provider ์ปดํฌ๋ํธ๋ React Context๋ฅผ ์ ๊ณตํ๋ ์ญํ ์ ํฉ๋๋ค. Provider ์ปดํฌ๋ํธ๋ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
โข
๊ธฐ๋ณธ ๋ฌธ๋ฒ
<MyContext.Provider value={ {๊ฐ1, ๊ฐ2, ...} }>
{children}
</MyContext.Provider>
JavaScript
๋ณต์ฌ
โข
MyProvider.jsx
// MyProvider.js
import React, { useState } from 'react';
import MyContext from './MyContext';
const MyProvider = ({ children }) => {
const [myState, setMyState] = useState('Hello Context~!');
return (
<MyContext.Provider value={{ myState, setMyState }}>
{children}
</MyContext.Provider>
);
};
export default MyProvider;
JavaScript
๋ณต์ฌ
value ์์ฑ์ ํตํด ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๊ณต์ ํ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ง์ ํ value ๋ฅผ Consumer ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Provider ํ์์์ context๋ฅผ ๊ตฌ๋
ํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ Provider์ย valueย prop๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ค์ ๋ ๋๋ง ๋ฉ๋๋ค.
Provider ์ปดํฌ๋ํธ๋ย valueย prop์ ๋ฐ์์ ์ด ๊ฐ์ ํ์์ ์๋ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌํฉ๋๋ค. ๊ฐ์ ์ ๋ฌ๋ฐ์ ์ ์๋ ์ปดํฌ๋ํธ์ ์์ ์ ํ์ ์์ต๋๋ค. Provider ํ์์ ๋ ๋ค๋ฅธ Provider๋ฅผ ๋ฐฐ์นํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฉฐ, ์ด ๊ฒฝ์ฐ ํ์ Provider์ ๊ฐ์ด ์ฐ์ ์๋ฉ๋๋ค.
- https://ko.legacy.reactjs.org/docs/context.html
Provider ์ ์ฉ
Context ๋ก ๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํฉ๋๋ค.
โข
๊ธฐ๋ณธ ๋ฌธ๋ฒ
// App.js
import React from 'react';
import { ์ปดํฌ๋ํธ์ด๋ฆ1 } from './์ปดํฌ๋ํธํ์ผ์ด๋ฆ1';
import { ์ปดํฌ๋ํธ์ด๋ฆ2 } from './์ปดํฌ๋ํธํ์ผ์ด๋ฆ2';
import Provider์ด๋ฆ from './Providerํ์ผ์ด๋ฆ';
const App = () => {
return (
<Provider์ด๋ฆ> {/* Context ๋ฅผ ์ ๊ณต๋ฐ์ ์ปดํฌ๋ํธ๋ค์ ๊ฐ์ธ์ค๋๋ค. */}
<div>
<์ปดํฌ๋ํธ์ด๋ฆ1 /> {/* Context ๋ฅผ ์ ๊ณต๋ฐ์ ์ ์๊ฒ ๋ฉ๋๋ค. */}
<์ปดํฌ๋ํธ์ด๋ฆ2 /> {/* Context ๋ฅผ ์ ๊ณต๋ฐ์ ์ ์๊ฒ ๋ฉ๋๋ค. */}
</div>
</Provider์ด๋ฆ>
);
};
export default App;
JavaScript
๋ณต์ฌ
โข
App.js
// App.js
import React from 'react';
import MyClassComponent from './MyClassComponent';
import MyFunctionalComponent from './MyFunctionalComponent';
import MyProvider from '.contexts/MyProvider';
const App = () => {
return (
<MyProvider>
<div>
<MyClassComponent />
<MyFunctionalComponent />
</div>
</MyProvider>
);
};
export default App;
JavaScript
๋ณต์ฌ
Consumer ์ปดํฌ๋ํธ ์ฌ์ฉ
โข
ํด๋์คํ ์ปดํฌ๋ํธ์์ Consumer ์ฌ์ฉ
ํด๋์ค ์ปดํฌ๋ํธ์์๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก Consumer๋ฅผ ์ฌ์ฉํฉ๋๋ค.
import ์ปจํ
์คํธ์ด๋ฆ from './์ปจํ
์คํธํ์ผ์ด๋ฆ';
class ํด๋์ค์ปดํฌ๋ํธ extends React.Component {
render() {
return (
<์ปจํ
์คํธ์ด๋ฆ.Consumer>
{({ ๊ฐ1, ๊ฐ2( ) }) => (
<div>
<p>{๊ฐ1}</p>
<button onClick={() => ๊ฐ2('๋ณ๊ฒฝํ ๊ฐ')}>์ปจํ
์คํธ ๋ณ๊ฒฝ</button>
</div>
)}
</์ปจํ
์คํธ์ด๋ฆ.Consumer>
);
}
}
export default ํด๋์ค์ปดํฌ๋ํธ;
JavaScript
๋ณต์ฌ
โข
ํจ์ํ ์ปดํฌ๋ํธ์์ Consumer ์ฌ์ฉ
ํจ์ํ ์ปดํฌ๋ํธ์์๋ useContext() Hook์ผ๋ก Consumer๋ฅผ ์ฌ์ฉํฉ๋๋ค.
import React, { useContext } from 'react';
import ์ปจํ
์คํธ์ด๋ฆ from './์ปจํ
์คํธํ์ผ์ด๋ฆ';
// ํจ์ ์ปดํฌ๋ํธ์์ useContext ์ฌ์ฉ
const ํจ์ํ์ปดํฌ๋ํธ = () => {
const { ๊ฐ1, ๊ฐ2 } = useContext(์ปจํ
์คํธ์ด๋ฆ);
return (
<div>
<p>{๊ฐ1}</p>
<button onClick={() => ๊ฐ2('๋ณ๊ฒฝํ ๊ฐ')}>์ปจํ
์คํธ ๋ณ๊ฒฝ</button>
</div>
);
};
export default ํจ์ํ์ปดํฌ๋ํธ;
JavaScript
๋ณต์ฌ
1.
ํด๋์คํ ์ปดํฌ๋ํธ์์ Consumer ์ฌ์ฉ
import React from 'react';
import MyContext from './MyContext';
// ํด๋์ค ์ปดํฌ๋ํธ์์ Consumer ์ฌ์ฉ
class MyClassComponent extends React.Component {
render() {
return (
<MyContext.Consumer>
{({ myState, setMyState }) => (
<div>
<p>{myState}</p>
<button onClick={() => setMyState('Updated!')}>Update State</button>
</div>
)}
</MyContext.Consumer>
);
}
}
export default MyClassComponent;
JavaScript
๋ณต์ฌ
2.
ํจ์ํ ์ปดํฌ๋ํธ์์ Consumer ์ฌ์ฉ
import React, { useContext } from 'react';
import MyContext from './MyContext';
// ํจ์ ์ปดํฌ๋ํธ์์ useContext ์ฌ์ฉ
const MyFunctionalComponent = () => {
const { myState, setMyState } = useContext(MyContext);
return (
<div>
<p>{myState}</p>
<button onClick={() => setMyState('Updated!')}>Update State</button>
</div>
);
};
export default MyFunctionalComponent;
JavaScript
๋ณต์ฌ
Context ์ถ๋ ฅ์ด๋ฆ ์ค์ - displayName
export const MyContext = React.createContext();
MyContext.displayName = 'MyContextName'
JavaScript
๋ณต์ฌ
๋ธ๋ผ์ฐ์ ์ React ๊ฐ๋ฐ๋๊ตฌ์์ ๋๋๋ง๋ ์ปดํฌ๋ํธ ์ด๋ฆ์ ์ง์ ํ ์ ์์ต๋๋ค.
์์ ์ฝ๋
Context ๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ์ฒ๋ฆฌ๋ ์์์ฝ๋๋ฅผ ์ดํด๋ด
๋๋ค.
๋ก๊ทธ์ธ์ด ๋์ง ์์์ ๋
โข
Context ์ ๋ก๊ทธ์ธ ์ฌ๋ถ ๋ฐ์ดํฐ(isLogin)๊ฐ false ์ผ ๋
๋ก๊ทธ์ธ ๋์์ ๋ ํ๋ฉด
โข
Context ์ ๋ก๊ทธ์ธ ์ฌ๋ถ ๋ฐ์ดํฐ(isLogin)๊ฐ true ์ผ ๋
์ค์น
โข
React ์ฑ ์์ฑ
npx create-react-app context-app
Shell
๋ณต์ฌ
โข
router ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
npm install react-router-dom
Shell
๋ณต์ฌ
ํ๋ก์ ํธ ๊ตฌ์กฐ
์์ ํ์ผ
โข
./contexts/LoginContextProvider.jsx
โข
./contexts/LoginContextConsumer.jsx
โข
./components/Header/Header.jsx
โข
./components/Header/Header.css
โข
./pages/Home.jsx
โข
./pages/About.jsx
โข
./pages/Login.jsx
โข
./pages/Join.jsx
โข
./pages/User.jsx
โข
App.js
โข
index.css
โข
App.css
./contexts/LoginContextProvider.jsx
import React, { useEffect, useState } from 'react';
export const LoginContext = React.createContext();
LoginContext.displayName = 'LoginContextName'
const LoginContextProvider = ({ children }) => {
const [isLogin, setIsLogin] = useState(false);
const logout = () => {
setIsLogin(false)
}
useEffect(() => {
setTimeout(() => {
setIsLogin(true);
}, 3000);
}, []);
return (
<LoginContext.Provider value={ {isLogin, logout} }>
{children}
</LoginContext.Provider>
);
};
export default LoginContextProvider;
JavaScript
๋ณต์ฌ
./contexts/LoginContextConsumer.jsx
import React, { useContext } from 'react';
import { LoginContext } from './LoginContextProvider';
const LoginContextConsumer = ({ children }) => {
const { isLogin } = useContext(LoginContext);
return (
<div>
<h3>๋ก๊ทธ์ธ ์ฌ๋ถ: {isLogin ? '๋ก๊ทธ์ธ' : '๋ก๊ทธ์์'}</h3>
{children}
</div>
);
};
export default LoginContextConsumer;
JavaScript
๋ณต์ฌ
./components/Header/Header.jsx
import React, { useContext } from 'react';
import { Link } from 'react-router-dom'
import './Header.css'
import { LoginContext } from '../../contexts/LoginContextProvider';
const Header = () => {
// โ
isLogin : ๋ก๊ทธ์ธ ์ฌ๋ถ - Y(true), N(false)
// โ
logout() : ๋ก๊ทธ์์ ํจ์ - setIsLogin(false)
const { isLogin, logout } = useContext(LoginContext);
return (
<header>
<div className="logo">
<Link to="/">
<img src="https://i.imgur.com/fzADqJo.png" alt="logo" className='logo' />
</Link>
</div>
<div className="util">
<ul>
{/* ๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ ๋๋๋ง */}
{ !isLogin ?
<>
<li><Link to="/login">๋ก๊ทธ์ธ</Link></li>
<li><Link to="/join">ํ์๊ฐ์
</Link></li>
<li><Link to="/about">์๊ฐ</Link></li>
</>
:
<>
<li><Link to="/user">๋ง์ดํ์ด์ง</Link></li>
<li><button className='link' onClick={ () => logout() }>๋ก๊ทธ์์</button></li>
</>
}
</ul>
</div>
</header>
)
}
export default Header
JavaScript
๋ณต์ฌ
./components/Header/Header.css
header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px;
border-bottom: 1px solid #000;
}
.logo {
width: 80px;
}
.util ul {
display: flex;
justify-content: space-between;
align-items: center;
column-gap: 12px;
}
.util ul li {
}
CSS
๋ณต์ฌ
./pages/Home.jsx
import React from 'react';
import LoginContextConsumer from '../contexts/LoginContextConsumer';
import Header from '../components/Header/Header';
const Home = () => {
return (
<>
<Header />
<div className='container'>
<h1>Home</h1>
<hr/>
<h2>๋ฉ์ธ ํ์ด์ง</h2>
<LoginContextConsumer />
</div>
</>
)
}
export default Home
JavaScript
๋ณต์ฌ
./pages/About.jsx
import React from 'react';
import LoginContextConsumer from '../contexts/LoginContextConsumer';
import Header from '../components/Header/Header';
const About = () => {
return (
<>
<Header />
<div className='container'>
<h1>About</h1>
<hr/>
<h2>์๊ฐ ํ์ด์ง</h2>
<LoginContextConsumer />
</div>
</>
)
}
export default About
JavaScript
๋ณต์ฌ
./pages/Login.jsx
import React from 'react'
import Header from '../components/Header/Header'
import LoginContextConsumer from '../contexts/LoginContextConsumer'
const Login = () => {
return (
<>
<Header />
<div className='container'>
<h1>Login</h1>
<hr/>
<h2>๋ก๊ทธ์ธ ํ์ด์ง</h2>
<LoginContextConsumer />
</div>
</>
)
}
export default Login
JavaScript
๋ณต์ฌ
./pages/Join.jsx
import React from 'react'
import Header from '../components/Header/Header'
import LoginContextConsumer from '../contexts/LoginContextConsumer'
const Join = () => {
return (
<>
<Header />
<div className='container'>
<h1>Join</h1>
<hr/>
<h2>ํ์๊ฐ์
ํ์ด์ง</h2>
<LoginContextConsumer />
</div>
</>
)
}
export default Join
JavaScript
๋ณต์ฌ
./pages/User.jsx
import React from 'react';
import LoginContextConsumer from '../contexts/LoginContextConsumer';
import Header from '../components/Header/Header';
const Home = () => {
return (
<>
<Header />
<div className='container'>
<h1>User</h1>
<hr/>
<h2>๋ง์ด ํ์ด์ง</h2>
<LoginContextConsumer />
</div>
</>
)
}
export default Home
JavaScript
๋ณต์ฌ
App.js
import React from 'react';
import { BrowserRouter, Route, Routes } from 'react-router-dom';
import './App.css';
import LoginContextProvider from './contexts/LoginContextProvider';
import About from './pages/About';
import Home from './pages/Home';
import User from './pages/User';
import Login from './pages/Login';
import Join from './pages/Join';
const App = () => {
return (
<BrowserRouter>
<LoginContextProvider>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/login" element={<Login />} />
<Route path="/join" element={<Join />} />
<Route path="/user" element={<User />} />
<Route path="/about" element={<About />} />
</Routes>
</LoginContextProvider>
</BrowserRouter>
);
};
export default App;
JavaScript
๋ณต์ฌ
index.css
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Noto Sans', sans-serif;
font-size: var(--font-size-main);
}
ul { list-style-type: none; }
a { text-decoration: none; color: black; }
button { cursor: pointer; }
.link { background-color: transparent; color: black; border: none; font-size: var(--font-size-main); }
:root {
--font-size-main : 20px;
}
CSS
๋ณต์ฌ
App.css
.container {
width: 1024px;
margin: 50px auto;
}
hr { margin-bottom: 50px; }
CSS
๋ณต์ฌ