Router - MoonGyeongHyeon/React_Study GitHub Wiki
Router๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ URL์ ์๋ธ๋๋ ํ ๋ฆฌ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ฌผ์ ๋ ๋๋งํด์ค๋ค. ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ฒ์๋ถํฐ ์น์ฑ์์ ์ฌ์ฉํ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์ ๋จผ์ ๋ถ๋ฌ์๋๊ณ , ํ์ด์ง๋ฅผ ์ด๋ํ ๋๋ง๋ค ๊ทธ๋ ๊ทธ๋ ํ์ด์ง๋ฅผ ์ฒ์๋ถํฐ ๋ก๋ฉํ์ง ์๊ณ ํ์ํ ์ปดํฌ๋ํธ๋ง ๋ค์ ๋ ๋๋งํ๋ค.
๊ธฐ๋ณธ ํ์ด์ง("/")์ ํ์ ํ์ด์ง 3๊ฐ("/home", "/About", "Articles")๋ฅผ ๊ตฌ์ฑํ๋ค. ๋ผ์ฐํ ํ 3๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ์.
ํธ์๋ฅผ ์ํด App.js์ ๋ชจ๋ ์ฝ๋๋ฅผ ์์ฑํ๋๋ก ํ๋ค.
import React from 'react';
import ReactDOM from 'react-dom';
import {
BrowserRouter as Router,
Route,
Link,
} from 'react-router-dom';
class App extends React.Component {
render() {
return (
<div>
<ul>
<li><Link to="home">Home</Link></li>
<li><Link to="about">About</Link></li>
<li><Link to="articles">Articles</Link></li>
</ul>
{this.props.children}
</div>
);
}
}
class Home extends React.Component {
render() {
return (
<h2>Hey, I am HOME!</h2>
);
}
}
class About extends React.Component {
render() {
return (
<h2>Hey, I am ABOUT!</h2>
);
}
}
class Articles extends React.Component {
render() {
return (
<h2>Hey, I am ARTICLES!</h2>
);
}
}
var rootElement = document.getElementById('app');
ReactDOM.render((
<Router>
<div>
<Route path="/" component={App}/>
<Route path="/home" component={Home}/>
<Route path="/about" component={About}/>
<Route path="/articles" component={Articles}/>
</div>
</Router>
), rootElement);
๋ถ๋ถ๋ถ๋ถ ๋ณด๋๋ก ํ์.
import React from 'react';
import ReactDOM from 'react-dom';
import {
BrowserRouter as Router,
Route,
Link,
} from 'react-router-dom';
ํ์ํ ํจํค์ง๋ฅผ importํ๋ค.
class App extends React.Component {
render() {
return (
<div>
<ul>
<li><Link to="home">Home</Link></li>
<li><Link to="about">About</Link></li>
<li><Link to="articles">Articles</Link></li>
</ul>
{this.props.children}
</div>
);
}
}
๋ฉ์ธ("/")์์ ๋ณด์ฌ์ค ์ปดํฌ๋ํธ์ด๋ค. Link
๋ Router
์ ๋ด์ฅ๋์ด์๋ ์ปดํฌ๋ํธ ์ค ํ๋๋ก, return <a {...props} onClick={this.handleClick} />
์ฒ๋ผ ๋์ํ๋ค. ๋งํฌ๋ฅผ ํด์ฃผ๋ a ํ๊ทธ์ ๊ฐ์๋ณด์ด์ง๋ง ๋ค๋ฅธ์ ์ ํด๋ฆญํ์ ๋, <a href="..">
ํ๊ทธ๋ ํ์ด์ง ์์ฒด๋ฅผ ๋ฆฌ๋ก๋ฉํด๋ฒ๋ฆฌ์ง๋ง, <Link>
๋ this.props.children
๋ถ๋ถ๋ง ๋ฆฌ๋ก๋ฉํด์ค๋ค.
this.props.children
์ ๋ฐ๋ก ์ค์ ํ๋ props๊ฐ ์๋๋ผ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ์ปดํฌ๋ํธ๋ก, ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๋ <Component> <...> </Component>
์์ <...>
๋ถ๋ถ์ด this.props.children
์ผ๋ก ์๋ ์ค์ ๋๋ค.
์ฆ, "Home" ๋งํฌ๋ฅผ ๋๋ฅด๊ฒ ๋๋ฉด ".../home" ์ ํด๋นํ๋ URL ์์ฒญ์ด ์ด๋ฃจ์ด์ง๊ณ , ๊ทธ ์๋ต ๊ฒฐ๊ณผ๋ฅผ this.props.children
๋ถ๋ถ์ ๋ฆฌ๋ก๋ฉ์ ํ๋ ๊ฒ์ด๋ค.
var rootElement = document.getElementById('app');
ReactDOM.render((
<Router>
<div>
<Route path="/" component={App}/>
<Route path="/home" component={Home}/>
<Route path="/about" component={About}/>
<Route path="/articles" component={Articles}/>
</div>
</Router>
), rootElement);
๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ ๋, <Router> <Route ...> ... </Route> </Router>
์ ํํ๋ก ์ฌ์ฉํ๋ค. path ์์ฑ์ URL ์ฃผ์๋ฅผ ์๋ฏธํ๋ฉฐ, component๋ ํด๋น URL์ ์์ํ๋ ์ปดํฌ๋ํธ๋ฅผ ์๋ฏธํ๋ค.
ํ์ง๋ง ์ด๋๋ก ์คํํ๋ค๋ฉด Cannot GET /Home
๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค. ํด๋น ์ฃผ์๋ฅผ ์๋ฒ์ ์์ฒญํ๋ฉด ์๋ฒ์ชฝ ๋ผ์ฐํฐ์์ ๋จผ์ ์ฐ๊ฒฐํ ๊ณณ์ด ์๋์ง ํ์ธํด๋ณด๋๋ฐ, ๊ทธ ๊ฒฐ๊ณผ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ํด ์๋ฒ์ ๋ฐ๋ก ์ค์ ์ ํด์ฃผ์ด์ผ ํ๋ค. webpack ๊ฐ๋ฐ ์๋ฒ์์, webpack.config.js ํ์ผ์ ์ฝ๋ ํ์ค์ ์ถ๊ฐํด์ฃผ๋๋ก ํ์.
devServer: {
/*...*/
historyApiFallback: true
},
historyApiFallback์ ํ์ฑํํด์ฃผ๋ฉด ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค.