먼저 react Route를 사용하려면
yarn add react-router-dom
명령어로 react-router-dom
을 설치해줘야 함
완료가 되면 index.js
파일을 다음과 같이 수정
import {BrowerRouter} from 'react-router-dom';
-------
/대충 이러저런 문장들/
-------
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root'),
);
사용방법은 간단함.
먼저 다음과 같은 파일들을 생성
Home.js
, About.js
, Profile.js
그 다음, Home.js
를 다음과 같이 작성
import React from 'react';
function Home() {
return (
<div>
<h1>홈</h1>
<p>이 곳은 홈입니다. 가장 먼저 보여지는 페이지입니다.</p>
</div>
);
}
export default Home;
그 후, About.js
도 다음과 같이 작성
import React from 'react';
function About({location}) {
return (
<div>
<h1>소개</h1>
<p>이 프로젝트는 리액트 라우터 기초를 실습해보는 예제 프로젝트입니다.</p>
</div>
);
}
export default About;
다음과 같이 작성했으면 App.js
를 다음과 같이 바꿔줌
import React from 'react';
import { Route, Link } from 'react-router-dom';
import About from './About';
import Home from './Home';
import Profile from './Profile';
function App() {
return (
<div>
<ul>
<li>
<Link to="/">홈</Link>
</li>
<li>
<Link to="/about">소개</Link>
</li>
</ul>
<hr />
<Route path="/" component={Home} exact />
<Route path="/about" component={About} />
</div>
);
}
export default App;
여기서 Route
는 path
를 통해 들어온 url
에 어떤 component
를 렌더링 해줄까를 정하는 태그임
component={}
부분에서 {}
에는 화면에 렌더링할 component
즉, 파일명.js
를 적어줌
이렇게 하고 yarn start
를 누르면 3000번 포트로 서버를 돌렸다는 가정하에http://localhost:3000
에서 Home
에 적어놨던 화면들이 렌더링되는 모습을 볼 수 있음
문제는 http://localhost:3000/about
인데 만약에 exact
를 component={home}
옆에 적어두지 않았다면 Home component
가 /about
에서도 같이 렌더링 되는 걸 알 수 있음
/about
을 /
가 포함하고 있다고 함 그래서 출력되는 것
따라서 제대로 정해진 화면만 출력하고 싶다면 exact
키워드를 사용
입력한 url
이 반드시 path
부분에 적혀있는 것과 일치한 component
만 화면에 출력해달란 의미
<Link>
는 <a>
를 대신하는 태그
왜 <a>
대신 <Link>
를 쓰냐면 <a>
로 다른 페이지에 이동할 경우, 전부 다 리렌더링함. (실제로 크롬 개발자 도구를 열어서 Network
부분을 보면 <a>
사용시 링크를 클릭하면 전부 다시 받아옴을 알 수 있음)
<Link>
는 거의 리렌더링이 없다시피 함
파라미터는 /about
같은 url
에 /something
하고 뭔가의 url
을 더 추가해주는 것을 말함
넘겨주는 쪽에서는 /about/:username
같이 :
와 value
를 붙여서 보내줄 수 있음
<Route path="/about/:username" component={About} />
위처럼 쓰면 됨
그리고 받는 페이지인 About.js
에서는
import React from 'react';
function About({match}) {
const {username} = match.params;
return (
<div>
<h1>소개</h1>
<p>이 프로젝트는 리액트 라우터 기초를 실습해보는 예제 프로젝트입니다.</p>
</div>
);
}
export default About;
match.params
를 이용해 :username
에서 적어준 username
을 const {username}
으로 받아올 수 있음
파라미터의 용도는 아이디나 유저이름 같은 특정 데이터를 조회할 때 사용함
쿼리의 경우는 다양한 옵션을 줘서 조회할 때 사용을 많이 함(검색 같은)
import React from 'react';
const explain = {
hello:{
type:'greeting',
desc:'Hello world!'
},
bye:{
type:'farewell',
desc:'Good bye!'
}
}
function About({match}) {
const {username} = match.params;
const doing = explain[username];
return (
<div>
<h1>소개</h1>
<p>이 프로젝트는 리액트 라우터 기초를 실습해보는 예제 프로젝트입니다.</p>
<p>{username}님 {doing.desc}!</p>
<p>type: {doing.type}</p>
</div>
);
}
export default About;
여기서
const explain = {
hello:{
type:'greeting',
desc:'Hello world!'
},
bye:{
type:'farewell',
desc:'Good bye!'
}
}
이 부분은 파라미터로 /about/hello
나 /about/bye
로 넘겨줘 렌더링 할 수 있게 해주는 객체임
const {username} = match.params;
const doing = explain[username];
이 부분에서 match.params
를 통해 username
을 받아오고 그 username
은 hello
나 bye
가 될 것임
그럼 doing
에는 about/hello
면 hello
가 가지는 객체 즉
{
type:'greeting',
desc:'Hello world!'
}
이 부분을 가져올 것이고, about/bye
면,
{
type:'farewell',
desc:'Good bye!'
}
를 가져올 것임
<p>{username}님 {doing.desc}!</p>
<p>type: {doing.type}</p>
따라서 요부분에 출력되는 코드가
hello님 Hello world! type: greeting
또는
bye님 Good bye! type: farewell
둘 중 하나가 될 것임
if (!doing) {
return <div>존재하지 않는 사용자입니다.</div>;
}
doing
이 없다는 것은, explain[username]
이 빈 값, 즉 객체 안에 존재하지 않음을 의미함 따라서 존재하지 않는다고 출력
파라미터를 여러개 쓰고 싶은 경우는
/about/:username/:nickname/:id
이런식으로 계속 넣어주면 됨
받을 땐 const {username, nickname, id} = match.params
로 받아오면 됨
쿼리는 먼저
yarn add qs
를 통해서 라이브러리를 가져와야 함 여기서 qs
는 queryString
의 약자
기존의 About.js
코드를 다음과 같이 수정
import React from 'react';
function About({ location }) {
console.log(location);
return (
<div>
<h1>소개</h1>
<p>이 프로젝트는 리액트 라우터 기초를 실습해보는 예제 프로젝트입니다.</p>
</div>
);
}
export default About;
location
으로 받아오는 값을 console
로 출력하면
{pathname: "/about", search: "", hash: "", state: undefined}
pathname: "/about"
search: ""
hash: ""
state: undefined
__proto__: Object
다음과 같은 값이 나옴, 여기서 url
을 /about?a=1
로 바꿔서 enter
를 눌러보면
{pathname: "/about", search: "", hash: "", state: undefined}
pathname: "/about"
search: "?a=1" >> 이 부분이 바뀜
hash: ""
state: undefined
__proto__: Object
search
부분이 바뀌어서 나오는 것을 알 수 있음
근데 우리가 필요한 것은 a=1
부분이지 ?
는 필요가 없음 따라서 다음같은 코드를 추가로 삽입
const query = qs.parse(location.search, { ignoreQueryPrefix: true });
위처럼 qs.parse
를 통해 location.search
값을 객체로 parsing시켜주는데
{ ignoreQueryPrefix: true }
를 넣어주면 자동으로 ?
를 빼준체로 객체를 가져오게 됨
여러 개를 쿼리에 넣고 싶은 경우는
about?a=1&b=2&c=3
같은 &(Ampersand)
를 사용하면 됨
쓸 때는 query
객체를 통해 a
를 호출해야 하니까 query.a
라고 쓰면 됨
주의할 점은 ?a=1
같이 숫자를 건네주는 경우도 1
은 문자열임
따라서, 숫자라고 생각해서 ?a=1&b=2
로 받아주고
const num = qs.parse(location.search, {ignoreQueryPrefix:true});
한 다음
const c = num.a+num.b
이런식으로 해주면 '1'+'2'라서 '12'가 됨
1+2라서 3이 되는게 아님
그럴 경우는 parseInt
같은 문자열을 숫자로 변환해주는 함수 사용