[React] react-router
- ๋ฅ์ง
- Development
- ๋ถ๋ฅ
- Javascript
- ๋ฑ๋ก์ผ
react-router๋ฅผ ์ฌ์ฉํ ์ผ์ด ์๊ฒจ์ ์ฝ์ง์ ํ๊ฒ ๋์๋ค.
react router ๊ธฐ๋ฅ์ ๊ฐ์ง ๋ชจ๋์ค์ ๊ฐ์ฅ ์ธ๊ธฐ์๋๊ฒ react-router ์ด๋ค.
๊ทธ๋ฐ๋ฐ require๋ฅผ ์ฌ์ฉํ ์ ์๋ ํ๊ฒฝ์ด์ด์ ๋ธ๋ผ์ฐ์ ๋ก ์์ค๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค.
node.js ํ์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋ํ๊ธฐ ์ํ์ฌ browserfly๋ฅผ ๋ง์ด ์ฐ๋๋ฐ ํ
์คํธํด๋ณด๋ ๋ผ์ฐํฐ์ ๊ดํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊น์ง ๋ชฝ๋
ํฉ์ณ๋ฒ๋ฆฌ๋ค๋ณด๋ ๋น๋ํ ๋ 4,5์ด๋ ๊ฑธ๋ฆฌ๋๊ฑฐ์๋ค.
๊ทธ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ require๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , <script src=""> ํ์์ผ๋ก ๋ถ๋ฌ์ค๊ณ ์ธ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์ฐพ์๋ณด๊ฒ ๋์๋ค. ์๋ฌด๋๋ require๋ ์ธ์ฐ์ด ์๋๋ฏ.. ใ
ใ
react-router
https://www.npmjs.com/package/react-router
npm์ react-router ๋ชจ๋ ํ์ด์ง์ ๊ฐ๋ฉด ์ค๊ฐ์ UMD ์น์
์ด ์๋ค.
์ฌ๊ธฐ์ CDN ์๋ด์์ ์์ค๋ฅผ ๋ฐ์ ์ ์๋ ๋งํฌ๊ฐ ์๋๋ฐ ๊ทธ ๋งํฌ๋ก ์ฌ์ฉํ๊ฑฐ๋ ์์ค๋ฅผ ๋ค์ด๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค.
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-router/1.0.0/ReactRouter.min.js"></script>
์์ค์์ ๋ณด๋ฉด ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ๋๋๊ฒ์ด๋ผ๊ณ ๋์์๋ค. ์ด๊ฒ์ผ๋ก Router ์ปดํฌ๋ํธ๋ฅผ ๊ณง์ฅ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
// using an es6 transpiler, like babel
import { Router, Route, Link } from 'react-router/umd/ReactRouter'
// using globals
var Router = window.ReactRouter.Router;
var Link = window.ReactRouter.Link;
var Route = window.ReactRouter.Route;
gulpfile.js
jsx๋ก ์ฝ๋ฉํ๋ค๋ฉด babel๋ก ๋น๋๋ ํญ์ ํด์ผํ ๊ฒ์ด๋ค. ๋๋ต์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ํ์คํฌ๋ฅผ ๋ง๋ค์๋ค.
var gulp = require('gulp');
var uglify = require('gulp-uglify');
var babel = require('gulp-babel');
var concat = require('gulp-concat');
// compile react
gulp.task('react', function(){
return gulp.src([ 'src/**/!(index)*.jsx', 'src/**/index.jsx'])
.pipe(babel({
plugins : ['transform-react-jsx'],
presets : ['es2015']
}))
.pipe(uglify())
.pipe(concat('app.js', { newLine: '\n' }))
.pipe(gulp.dest("dist"));
});
gulp.task('react:watch', function(){
gulp.watch('src/**/*.jsx', ['react']);
});
concat์ผ๋ก ์์ค๋ฅผ ํฉ์น ๋ index.jsxํ์ผ์ ์คํํ๋ ์ฝ๋๊ฐ ๋ค์ด์์ด ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ค์ด๊ฐ์ผํ ํ์๊ฐ ์์ด์ gulp.src([ 'src/**/!(index)*.jsx', 'src/**/index.jsx'])ํ์์ผ๋ก ์์ ํ๋ค.
es2015 ํ์์ ํฅ๋ฏธ๊ฐ ์๊ฒจ es2015 ํ์์ผ๋ก ์ฝ๋ฉํ๋ฉด์ babel ํ๋ฆฌ์
์ผ๋ก es2015๋ฅผ ๋ฃ์๋ค. ๊ทธ ์ ์ npm install --save-dev babel-preset-es2015 ๋ช
๋ น์ผ๋ก ๋ชจ๋์ ์ค์นํด์ค์ผ ํ๋ค.
History
๋ฐ๋ชจ๋ฅผ ๋ฅผ ๋ง๋ค์ด๋ณด๋ ?_k=abc123 ๊ฐ์ด ๊ณ์ ๋ถ์ด๋๋๊ฒ์ด๋ค.
์ฐพ์๋ณด๋ ๋๋ต์ ์ผ๋ก history์ ๊ดํ ๋ถ๋ถ๋๋ฌธ์ ๋ฌ๋ฆฌ๋๊ฑฐ ๊ฐ์๋ฐ ์์ ๋ ๋ฐฉ๋ฒ์ด ์์์ง๋ง require๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ ํ๊ฒฝ์์๋ ์ญ์ ์ ๋ฅผ ๋จน๋๋ค.
๋๋ถ๋ถ์ ํด๊ฒฐ๋ฐฉ๋ฒ์์๋ createBrowserHistory ๋ชจ๋์ ์ฌ์ฉํด๋ผ๊ณ ํด์ ์ฐพ์๋ณด๊ฒ ๋์๋ค.
import createBrowserHistory from 'history/lib/createBrowserHistory';
...
<Router history={createBrowserHistory()}>
์ด๊ฒ์ require๋ฅผ ์ฐ๋ ๋ฐฉ๋ฒ์ด๋ผ์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ์์ด๋ค.
https://www.npmjs.com/package/history
์ผ๋จ History ๋ชจ๋ ์ฌ์ดํธ์์ ์ธ์คํจ ์น์
์์ umd ํ์์ ์์ค๋ฅผ cdn ์ฃผ์๊ฐ ์๋๊ฑธ ๋ณด๊ฒ ๋์๋ค.
<script src="https://npmcdn.com/history/umd/History.min.js"></script>
Load library
js์์ require๋ก ๋ชจ๋์ ๋ถ๋ฌ์ค์ง ์๊ธฐ ๋๋ฌธ์ html์์ <script src=""/>๋ก ๋ชจ๋์ ๋ถ๋ฌ์์ผํ๋ค.
<div id="app"></div>
<script src="react-0.14.3.js"></script>
<script src="react-dom-0.14.3.min.js"></script>
<script src="ReactRouter.min.js"></script>
<script src="History.min.js"></script>
<!-- build js file -->
<script src="dist/app.js"></script>
src/index.jsx
์ฌ๋ฃ๋ ์ค๋น๋์์ผ๋ ๋น๋ํ ์์ค๋ฅผ ์ฝ๋ฉํ๋ค.
const Router = window.ReactRouter.Router;
const Link = window.ReactRouter.Link;
const Route = window.ReactRouter.Route;
const IndexRoute = window.ReactRouter.IndexRoute;
const createHashHistory = window.History.createHashHistory;
// render router
ReactDOM.render(
(
<Router history={createHashHistory({ queryKey: false })}>
<Route path="/" component={App}>
<Route path="user" component={User}/>
</Route>
</Router>
),
document.getElementById('app')
);
๋ผ์ฐํฐ์ ๋ชจ๋์ ์ปดํฌ๋ํธ ์์๋ก ํ ๋นํ ๋ถ๋ถ
const Router = window.ReactRouter.Router;
const Link = window.ReactRouter.Link;
const Route = window.ReactRouter.Route;
const IndexRoute = window.ReactRouter.IndexRoute;
History ๋ชจ๋์ ์ปดํฌ๋ํธ ์์๋ก ํ ๋นํ ๋ถ๋ถ
const createHashHistory = window.History.createHashHistory;
History ๋ชจ๋์ console๋ก ๋ค์ ธ๋ณด๋ createBrowserHistory๋ฉ์๋๊ฐ ์์๋ค.
๊ทธ๋์ ๋ค๋ฅธ ๋ฉ์๋๋ค์ ํ๋์ฉ ํ
์คํธํด๋ณด๋ฉด์ ์ฝ์ง์ ํด๋ณด๋ createHashHistory ๋ฉ์๋๋ก ์ฌ์ฉํ ์ ์์๋ค. react-router๋ #ํด์ฌ ๋ฌธ์๋ก url ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ๋๋ฌธ์ธ๋ฏ..
Render
๋ผ์ฐํฐ ์ปดํฌ๋ํธ ๋ ๋๋ฅผ ํ๊ธฐ์ํ ์ฝ๋
ReactDOM.render(
(
<Router history={createHashHistory({ queryKey: false })}>
<Route path="/" component={App}>
<Route path="user" component={User}/>
</Route>
</Router>
),
document.getElementById('app')
);
<Router history={createHashHistory({ queryKey: false })}> ๋ถ๋ถ์ _k ํ๋ผ๋ฉํฐ๋ฅผ ์์ ๊ธฐ ์ํ์ฌ ํ๋กํผํฐ๋ฅผ ๋ฃ์๋ค.
url์ฃผ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ด๋ํ๋๋ก ์ฒ๋ฆฌํ๋ค.
| URL | Component |
|------- |----------------- |
| / | <App/> |
| /user | <User/> |
App.jsx
/๋ก ์ด๋ํ ๋ ๋ถ๋ฌ์ค๋ ์ปดํฌ๋ํธ
const App = React.createClass({
render() {
return (
<div>
<h1>Hello App</h1>
{this.props.children}
</div>
)
}
});
์ฃผ์๊น๊ฒ ๋ด์ผํ ๋ถ๋ถ์ {this.props.children}
this.props.children ๊ฐ์ ํ์ Route๋ฅผ ๊ฐ๋ฅดํจ๋ค. ์ฌ๋ฌ๊ฐ๊ฐ ์๋ค๋ฉด ๋ค๋ฅด๊ฒ ํ์๋ ํ
๋ฐ console๋ก this.props๊ฐ์ ์ฒดํฌํด๊ฐ๋ฉด์ ๋ฃ์ผ๋ฉด ๋ ๊ฒ์ด๋ค.
User.jsx
App ์ปดํฌ๋ํธ์ ์์์ผ๋ก ์ถ๋ ฅ๋๋ ์ปดํฌ๋ํธ
const User = React.createClass({
render() {
return (
<div>
<h1>Hello User</h1>
</div>
)
}
});
ps.
์ ์ฒด์ ์ธ ์์ค๋ ์ฌ์ ๊ฐ ์๊ธด๋ค๋ฉด ์ ๋ฆฌํด๋ณด๊ฒ ์. ใ ใ
0๊ฐ์ ๋๊ธ
๋ฑ๋ก๋ ๋๊ธ์ด ์์ต๋๋ค.