React-router
는 React의 라우팅 기능을 위해 가장 많이 사용하는 라이브러리다.Router
는 컴포넌트 URL에서 서버에 들어오는 클라이언트의 request 경로를 결정해 '보고싶은 부분만 변화'시켜 준다. npm install --save react-router-dom
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;
react-router-dom
을 설치하면 프로젝트에 router components를 import 할 수 있다.BrowserRouter
다. import { BrowserRouter as Router} from ‘react-router-dom’;
Router
안에서 렌더링 되어야하며, 2) 렌더링 될 URL이 있는 path
prop을 가져야 하며, 3) 그 path와 맞는 component를 감싸고 있어야 한다.<Component />
로 넣어주면 된다.
<Route exact path>
에서 'exact'를 넣어주는 이유는 exact가 없으면 '/'가 들어간 모든 페이지가 화면에 노출된다. 정확하게 '/', '/signup'만 보여줘!를 의미하는 것!
ReactDOM.render(<Routes />, document.getElementById('root'));
<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;
react-router-dom
에서 제공하는 <Link>
컴포넌트는 DOM에서 <a>
로 변환(Compile) 된다. cf. JSX - Babel - JavaScript<a>
태그와 마찬가지로 <Link>
태그도 지정한 경로로 바로 이동시켜주는 기능을 한다.<Link>
는 to
prop을 갖는다. (=href)<a>
vs <Link>
<a>
- 외부 사이트로 이동하는 경우<Link>
- 프로젝트 내에서 페이지 전환하는 경우
<a>
태그는 페이지를 새로 불러오면서 앱이 초기화되는 렌더링을 해 상태 값을 잃고 속도가 저하될 수 있다.<Link>
컴포넌트는 HTML History API를 사용해 브라우저의 주소만 바꿔준다.
<Link>
와 같이 페이지를 전환하는 경우 사용할 수 있으며 이 때 링크는 자동적으로 'active'
클래스를 적용한다. .active
를 적용해 active와 inactive를 구분해야하는 링크에 유용하게 적용할 수 있다.activeClassName
을 적용해 따로 클래스명을 줄 수 있다.this.props.history.push()
로 구현import React from 'react';
import { withRouter } from 'react-router-dom';
class Login extends React.Component {
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>
)
}
}
export default withRouter(Login);
withRouter
로 감싸주어야 한다.withRouter
와 같이 해당 컴포넌트를 감싸주는 것을 Higher Order Component(HOC)라고 한다. <Link>
this.props.history.push()