ํ ํ์ด์ง๋ก ์ฌ๋ ค UI๋ค์ ๋ณด์ฌ์ค ์ ์๋ ์ดํ๋ฆฌ์ผ์ด์ .
cf ) ๊ธฐ์กด ์ฌ์ฉ ๋ฐฉ์(MPA: Multiple Page Application) : ๊ธฐ๋ณธ์ ์ผ๋ก ์นํ์ด์ง ๋ก๋ฉํ ๋๋ index.html์ ๊ฐ๋ฅดํค๊ฒ ๋์ด์๋ค.
react-router ์ค์น : npm -install react-router-dom --save
๐ํ์ธํ๋ ๋ฐฉ๋ฒ : package.json์ dependencies์ react-router-dom์ด ์๋ก ์๊ธด๊ฒ์ ํ์ธํด ๋ณผ ์ ์๋ค.
import React from 'react';
import {
BroweserRouter as Router,
Switch,
Route
} from 'react-router-dom';
import Login from './pages/Login/Login';
import Signup from './pages/Signup/Signup';
import Main from './pages/Main/Main';
class Routes extends React.Component {
render(){
return (
<Router>
<Nav />
<Switch>
<Route exact path="/" component={Login} />
<Route exact path="/signup" component={Signup} />
<Route exact path="/main" component={Main] />
</Switch>
<Footer />
</Router>
)
}
}
โ React-router-dom์์ import ํ ๊ฒ : BrowserRouter as Router, Switch, Route
โ : ๋ผ์ฐํฐ๋ก ๊ฐ์ธ์ฃผ๊ณ ์์ํ๋ค๋ ์ฌ์ค์ ์์ง ๋ง์!
โ Reat์์๋ Router๋ฅผ ์จ์ผ ๋ค๋ฅธ UI๋ก ์ด๋ํ ์ ์๋ค.
โexact
: ์ ํํ ๊ฒฝ๋ก ์ค์ ์ ํ๊ธฐ ์ํ ์ฅ์น์ด๋ค. ์๋ฅผ ๋ค์ด "/signup" ์ด๋ ๊ฒ ๋์ด ์์ ๊ฒฝ์ฐ, ๊ฒฝ๋ก๊ฐ signup์ผ ๋๋ง ๊ฒฝ๋ก ์ด๋์ ํด์ค ๋ผ๋ ๋ป!
๐ก ํญ์ ๊ณ ์ ๋์ด์ผ ํ๋ View๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น??
์ค์์น ์์ ๋ค์ด๊ฐ๋ฉด ๋ฌด์กฐ๊ฑด ํ๋์ ์ปดํฌ๋ํธ๋ง ๋ค์ด๊ฐ์ผ ํ๋ฏ๋ก Switch ๋ฐ์ ์์นํ๋ค. ๋ํ์ ์ผ๋ก nav, footer๊ฐ ์๋ค.
๋ฐฉ๋ฒ 1. <Link>์ปดํฌ๋ํธ
< Link to ="/main"> main์ผ๋ก ์ด๋
๊ฐ๋ฐ์๋๊ตฌ์์ ํ์ธํด๋ณด๋ฉด a
ํ๊ทธ๋ก ๋์ด ์๋ ๊ฒ์ ํ์ธํด๋ณผ ์ ์๋ค.
๐ก ์ ๊ทธ๋ผ a
ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ง ์์๊น?
<a>
: ์ธ๋ถ ์ฌ์ดํธ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๋ค.
์๋ฒ์ ๋งค๋ฒ ์๋ก์ด ํ์ด์ง๋ฅผ ๋ฐ์์์ ์ด๋ํ๊ฒ ๋๋ฏ๋ก ์๋ฒ์ ์์ฒญ์ด ๋ง์์ง ์๋ก ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๊ฒ ๋๋ค. ์ฆ ๋งค๋ฒ ์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ ๊ทธ๋ ค์ง๊ฒ ๋๋ฏ๋ก ๋นํจ์จ์ ์ผ ์ ์๋ค.
๐ก <Link>
๋ ํ๋ก์ ํธ ๋ด๋ถ์์ ํ์ด์ง๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
์๋ฒ์ ๋ณ๋์ ์์ฒญ์ ํ ํ์๊ฐ ์๊ณ , ๋จ์ํ url๋ง ๋ณ๊ฒฝํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ถํ๊ฐ ๊ฑธ๋ฆด ์ผ์ด ์๋ค.
react-router-dom์ด ์ค์ ํ๋ฉด์์ ๋ณํ๋์ด์ผ ํ๋ ๋ถ๋ถ๋ง ๋ณ๊ฒฝํด์ ๋ณด์ฌ์ค๋ค.
๐ก SPA์์๋ <Link>
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์ด๋ค.
this.props.history.push()
์ด๋ค ๊ฒฝ์ฐ์ history.push()๋ฅผ ์ฌ์ฉํ ๊น?
โ js ๋ก์ง ์์ ํ์ด์ง ์ด๋์ด ํ์ํ ๋๊ฐ ์๋ค. ์ด๋ด ๊ฒฝ์ฐ์ ๋งํฌ tag๋ฅผ ์ฌ์ฉํด์ ๋ฃ์ ์ ์์ผ๋ฏ๋ก history.push()๋ฅผ ์ฌ์ฉํ๋ค.
goMain ํจ์ ๋ด์ this.props.history.push("/main");์ ํตํด main ํ๋ฉด์ผ๋ก ์ด๋ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
export default withRouter(Footer); ๋ฅผ ํด์ค์ผ ์ด๋์ด ๊ฐ๋ฅํจ!
โerror๊ฐ ๋๋ฉด ๋ฌด์กฐ๊ฑด ์ฝ์ ์ฐ์ด๋ณด๊ธฐ!
โโ ๋ณดํต์ ๋ก ์ฐ๊ฒฐ๋์ด ์์ง ์์ Component์ ๊ฒฝ์ฐ withRouter๋ฅผ ์ฌ์ฉํด์ค์ผ ์ด๋ํ ์ ์๋ค.
๐ก ๋ด ์์ ํ์ผ์์ .css โ .scss๋ก ํ์ฅ์๋ช ์ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ, position์ layout์ด ๊นจ์ง๋ ํ์์ด ๋ฐ์ํ๋ค. ๊ทธ ์ด์ ๋ ๋ญ๊น??
- ๋จ ํ๋์ css ํด๋์ ๋ชฐ๋ฆฌ๊ฒ ๋๋ฉด์ position์ด ์ ๋ถ ๊ผฌ์ด๊ฒ ๋๋ ๊ฒ์ด๋ค. tagName์ผ๋ก style์ ์ฃผ์๊ฑฐ๋, ๋์ผํ ํด๋์ค๋ช ์ผ๋ก ์ฌ์ฉ๋์์ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฉด, ๊ฒน์น๊ฒ ๋๋ ๊ฒ์ด๋ฏ๋ก ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด
nesting์ ์ฌ์ฉํ๋ค.
โ ์ฒดํฌํ ์ฌํญ ํ์ธํ๊ธฐ
import { withRouter } from 'react-router-dom;' ์ด ๋๋ฝ๋์ด์๋์ง ํ์ธํ์!
import๋ถํฐ ์๋ฌ๊ฐ ๋๊ฒ ๋๋ฉด ํ๋ฉด ๊ตฌํ์ด ์์ ๋์ง ์๋๋ค!
import { TRUE } from 'node-sass' : ์๋์์ฑ๋๋ ์ฝ๋์ด๋ฏ๋ก ํ์ธํด์ ์ญ์ ํ๋๋ก ํ์!
Nav ๊ฒฝ๋ก ๋ฌธ์ : Nav ์ปดํฌ๋ํธ ๋ด์ ์๋ ์ด๋ฏธ์ง๋ค์ ๊ฒฝ๋ก ์ค์ ์ ์ฒดํฌํด๋ณด์!
<Link>๋ฅผ ์จ์ ๋ก๊ทธ์ธ์ฐฝ์์ ๋ฉ์ธ์ผ๋ก ์ด๋ํ๋ ค๊ณ ํ ๊ฒฝ์ฐ, ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ์ ๋ ๊ตฌํ๋์ง ์๋๋ค. ๊ทธ๋ฅ ๋ฒํผ๋ง ๋๋ฅด๋ฉด ๊ตฌํ์ ๋จ โ this.props.historyl.push('/main')์ด ๋ฐฉ๋ฒ์ผ๋ก button์ onClick์ ์ฃผ๋ฉด ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ชจ๋ ์ ๋ ฅํ๊ณ ๋ฒํผ์ ์ ๋ ฅํ์ ๋ ์ ์์ ์ผ๋ก ๋ฉ์ธ์ผ๋ก ๋์ด๊ฐ์ ํ์ธํ ์ ์๋ค.
[์ฐธ๊ณ ์ฌํญ]
โ history : history ๊ฐ์ฒด๋ ๋ผ์ฐํธ๋ก ์ฌ์ฉ๋ ์ปดํฌ๋ํธ์ match, location๊ณผ ํจ๊ป ์ ๋ฌ๋๋ props ์ค์ ํ๋๋ค. ์ด ๊ฐ์ฒด๋ฅผ ํตํด ์ปดํฌ๋ํธ ๋ด์ ๊ตฌํํ๋ ๋ฉ์๋์์ ๋ผ์ฐํฐ API๋ฅผ ํธ์ถํ ์ ์๋ค.
ํน์ ๋ฒํผ์ ๋๋ ์ ๋ ๋ค๋ก ๊ฐ๊ฑฐ๋, ๋ก๊ทธ์ธ ํ ํ๋ฉด์ ์ ํํ๊ฑฐ๋, ๋ค๋ฅธ ํ์ด์ง๋ก ์ดํํ๋ ๊ฒ์ ๋ฐฉ์งํด์ผ ํ ๋ history ํ์ฉ
โ withRouter : HoC(Higer-order Component)
๋ผ์ฐํธ๋ก ์ฌ์ฉ๋ ์ปดํฌ๋ํธ๊ฐ ์๋์ด๋ match, location, history ๊ฐ์ฒด๋ฅผ ์ ๊ทผํ ์ ์๊ฒ ํด์ค๋ค.