๐ฟ ๋ผ์ฐํ (Routing)์ด๋?
๋ค๋ฅธ ๊ฒฝ๋ก(url ์ฃผ์)์ ๋ฐ๋ผ ๋ค๋ฅธ View(ํ๋ฉด)๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ
- React ์์ฒด์๋ ์ด๋ฐ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ง ์๋ค. (์ด๊ฒ์ด React๊ฐ Framework ๊ฐ ์๋ Library ๋ก ๋ถ๋ฅ๋๋ ์ด์ )
- ๊ทธ๋์ React์ ๋ผ์ฐํ ๊ธฐ๋ฅ์ ์ํด ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ React-router๋ฅผ ์ฌ์ฉํ๋ค.
๐ฟ ๋ฆฌ์กํธ ๋ผ์ฐํฐ(React Router)๋?
angular์ด๋ angular2, backbone ๊ฐ์ ํ๋ ์์ํฌ๋ ํ๋ ์์ํฌ์ด๊ธฐ ๋๋ฌธ์ ๋ผ์ฐํ ๊ธฐ๋ฅ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ด์๋ค. ํ์ง๋ง React๋ View๋ง ๋ด๋นํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. ๊ทธ๋์ ๋ผ์ฐํ ์ ๋ด๋นํ๋ react-router์ ๋ฐ๋ก ์ค์นํด์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋์ค์ Model๊ณผ Controller๋ฅผ ๋ด๋นํ๋ ํจํค์ง๋ฅผ ์ค์นํด์ผ ํ๋ค.
์๋ฅผ ๋ค๋ฉด, ์๋๋ ํ์ด์ง์ ๋ฐ๋ผ์ url link๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋๋ค. ๊ทธ๋ฐ๋ฐ SPA๋ ๊ตฌ์กฐ์ ๋จ์ผ ํ์ด์ง์ด๊ธฐ ๋๋ฌธ์ ๋ณด์ฌ์ง๋ ํ์ด์ง ๋ชจ์ต์ ๋ฌ๋ผ์ ธ๋ ์ฃผ์๋ ๋ฌ๋ผ์ง์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ๊ธฐ ์ํด์ ๋ฑ์ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ React Router์ด๋ค.
๐ฟReact Router ์ ์ฉํ๋ ๋ฒ
๐ฅ ์ค์น ํ๋ ๋ฒ
1. ํฐ๋ฏธ๋์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋๋ค๐๐
npm install react-router-dom --save
์ค์นํ๋ฉด ์๋์ ๊ฐ์ด package.json ํ์ผ์ 'react-router-dom'์ด๋ผ๋ ์ฝ๋๊ฐ ์์ฑ๋์์ ๊ฒ์ด๋ค.
2. Routes ์ปดํฌ๋ํธ ๊ตฌํํ๊ธฐ
import React from 'react';
import {
BrowserRouter 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>
);
}
}
export default Routes;
3. index.js ๋ณ๊ฒฝ
ReactDOM.render(<Routes />, document.getElementById('root'));
์๋๋ ์ ๊ธฐ <Routes /> ๋ถ๋ถ์ด <App />๋ก ๋์ด์์์ ๊ฒ์ด๋ค. ๋ณ๊ฒฝํด์ค์๋ค!
4. Route ์ด๋ํ๊ธฐ
Route๋ฅผ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์๋ค.
๐ฅ <Link> ์ปดํฌ๋ํธ ์ฌ์ฉํ๊ธฐ
- ํด๋ฆญ ์ ๋ฐ๋ก ์ด๋ํ๋ ๋ก์ง ๊ตฌํ ์์ ์ฌ์ฉํ๋ค.
ex) Nav Bar, Aside Menu, ์์ดํ ๋ฆฌ์คํธ ํ์ด์ง์์ ์์ดํ ํด๋ฆญ ์ > ์์ธ ํ์ด์ง๋ก ์ด๋. - react-router-dom์์ ์ ๊ณตํ๋ <Link> ์ปดํฌ๋ํธ๋ DOM์์ <a> ํ
์คํธ๋ก ๋ณํ๋๋ค.
cf) <a> vs <Link>- <a> : ์ธ๋ถ ์ฌ์ดํธ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ
- <Link> : ํ๋ก์ ํธ ๋ด์์ ํ์ด์ง ์ ํํ๋ ๊ฒฝ์ฐ
import React from 'react';
import { Link } from 'react-router-dom';
class Login extends React.Component {
render() {
return (
<div>
<Link to="/signup">ํ์๊ฐ์
</Link>
</div>
)
}
}
export default Login;
๐ฅ withRouterHOC๋ก ๊ตฌํํ๊ธฐ
- ํ์ด์ง ์ ํ ์ ์ถ๊ฐ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๋ก์ง์ด ์๋ ๊ฒฝ์ฐ withRouterHOC ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ๋ค.
ex) ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ ์- Backend API๋ก ๋ฐ์ดํฐ ์ ์ก
- User Data ์ธ์ฆ/์ธ๊ฐ
- response message
- Case 1 : ํ์ ๊ฐ์ ๋์ด ์๋ ์ฌ์ฉ์ > Main ํ์ด์ง๋ก ์ด๋
- Case 2 : ํ์ ๊ฐ์ ์ด ๋์ด ์์ง ์์ ์ฌ์ฉ์ > Signup ํ์ด์ง๋ก ์ด๋
import React from 'react';
import { withRouter } from 'react-router-dom';
class Login extends React.Component {
goToMain = () => {
this.props.history.push('/main');
}
// ์ค์ ํ์ฉ ์์
// goToMain = () => {
// if(response.message === "valid user"){
// this.props.history.push('/main');
// } else {
// alert("๋ ์ฐ๋ฆฌ ํ์ ์๋. ๊ฐ์
๋จผ์ ํด์ฃผ์ธ์")
// this.props.history.push('/signup');
// }
// }
render() {
return (
<div>
<button
className="loginBtn"
onClick={this.goToMain}
>
๋ก๊ทธ์ธ
</button>
</div>
)
}
}
export default withRouter(Login);
- <Link /> ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์์ onClick ์ด๋ฒคํธ๋ฅผ ํตํด ํ์ด์ง๋ฅผ ์ด๋ํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
- goToMain ๋ผ๋ event handler์์ ๊ตฌํํ ๊ฒ์ฒ๋ผ props ๊ฐ์ฒด์ history (this.props.history)์ ์ ๊ทผํด์ ์ด๋ํ ์ ์๋ค.
- ๋ฐ์ history์ push ๋ฉ์๋์ ์ธ์๋ก Routes.js ์์ ์ค์ ํ path๋ฅผ ๋๊ฒจ์ฃผ๋ฉด, ํด๋น ๋ผ์ฐํธ๋ก ์ด๋ํ ์ ์๋ค.
- ์ด ์ปดํฌ๋ํธ(Login ์ปดํฌ๋ํธ)์์ props์ route ์ ๋ณด(history)๋ฅผ ๋ฐ์ผ๋ ค๋ฉด exportํ๋ ์ปดํฌ๋ํธ๋ฅผ withRouter๋ก ๊ฐ์ธ์ฃผ์ด์ผ ํ๋ค.
์ด๋ ๊ฒ withRouter ์ ๊ฐ์ด ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ์ฃผ๋ ๊ฒ์ HOC(Higher Order Component) ๋ผ๊ณ ํ๋ค.
'JavaScript > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] 10๊ฐ์ง Hooks (0) | 2021.11.24 |
---|---|
[React] React๋? (0) | 2021.11.18 |
[React] State & Event (0) | 2021.11.18 |
[React] Props & Event (0) | 2021.11.18 |
[React] map ํจ์ ์ ์ฉ์ key props๋ฅผ ๋ถ์ฌํ๋ ์ด์ (0) | 2021.11.18 |
๋๊ธ