import React, {useState} from 'react'
import Home from "./Home";
import About from "./About";
import NotFound from "./NotFound";
function App(){
const [comp, setComp] = useState(Home)
return(
<>
<header>
<button onClick={() => setComp(Home)}>Home</button>
<button onClick={() => setComp(About)}>About</button>
<button onClikc={() => setComp(NotFound)}>Users</button>
</header>
<hr />
<main children={comp} />
</>
);
}
export default App;
위와 같이 <header>
내에 특정 메뉴 버튼을 클릭하면 그에 상응하는 컴포넌트 comp
상태가 바뀌도록 해놓으면 버튼 클릭시 화면에서 <main />
부분이 업데이트 되어 특정 버튼에 해당하는 화면으로 전환 되어진다.
BrowserRouter
와HashRouter
이다.HTML5를 지원하는 브라우저의 주소를 감지 한다.
<BrowserRouter>
태그로 컴포넌트 감싸주기Routes
를 감싸서 그 중 규칙이 일치하는 라우트 단 하나만 렌더링 시켜주는 역할을 한다.<Route path=URL element={출력하고자 하는 컴포넌트} />
<Route path="/about" component={About}>
현재 주소창의 경로가 /about 인경우 About 이라는 컴포넌트를 보여준다. 일반적으로 현재 주소창의 URL 경로에 따라 특정 컨텐츠를 보여주거나 숨기기 위해서 사용될 수 있다.
여러 라우팅을 매칭하고 싶은 경우 URL 뒤에 *을 사용하면 된다.
<Route path="/page1/*" element={<Page1 />} />
<Route path="/page2/*" element={<Page2 />} />
<Route path="/*" element={<NotFound />} />
<a>
태그와 유사한 기능, to prop을 통해서 이동할 경로를 지정해준다.target
속성으로 새로운 페이지 생성 막을 수 있다.<Link to=URL>링크명</Link>
import { Link } from "react-router-dom";
<Link to="/about">About</Link>;
위의 코드는 브라우저에서 클릭이 가능한 about으로 렌더링되고, about을 클릭하면 주소창의 경로가 <도메인 네임> /about 으로 갱신된다.
<Link to = {{pathname:"/home",state:state}} />
<Link to="/home" state={state} />
리액트에서 라우터 사용시 파라미터 정보를 가져와 활용하고 싶다면 useParams
라는 훅을 사용하면 된다.
URL/user/1
- user/1는
pathname
→ useLocation() 사용- 1은
parameter
→ useParams() 사용
Sample 1
//현재 컴포넌트 라우터 경로 : URL/user/1
import React from "react";
import {useParams} from 'react-router-dom';
const test = ()=>{
let { params } = useParams();
return(
<div className="test">
<p>현재 페이지의 파라미터는 {params} 입니다.</p>
</div>
)
}
export default test
→ URL/user/1의 parameter가 1
이므로 변수 params는 1
이 된다.
현재 URL 정보를 가져올 수 있다.
import { useLocation } from "react-router-dom"; //import 한다.
export default function Location(){
const a = useLocation(); //useLocation 정보를 담는다.
console.log(a);
return(
<>
...
</>
)
}
콘솔 결과값
location 정보
hash
#문자열 형태의 값, segment라고 부르기도 하는데 하나의 페이지 내에서 이동하기 위해서 사용, 예전의 구형 브라우저에서 클라이언트 라우팅을 할 때 사용, jquery mobile 이 hash를 사용, jquery(Cross Browsing 라이브러리) mobile 이 hash를 사용
Jquery state : 페이지 이동시 임의로 넣을 수 있는 상태 값 -❗️좀 더 알아보기
key
location 객체의 고유값, 초기값은 default 페이지가 변경될 때 마다 고유의 값이 생성된다.
pathname
query String을 제외한 경로 및 현재 주소 경로
search
? 를 포함한 query String
state
페이지로 이동시 임의로 넣을 수 있는 상태 값
※ react-router-dom v6부터 제네릭을 지원하지 않는다.
//Coins component
<Link to={`/${coin.id}`} state={{ name: coin.name }}></Link>;
//state안에 있는 객체값 url에 넘겨주기.
//Coin component
interface LoactionParams {
state: {
name: string;
};
}
const state = useLocation() as LocationParams;
새탭으로 URL을 입력하여 화면을 열어보면 에러가 발생 할 것이다.
에러가 나는 이유는 새 탭으로 화면을 열 경우 해당 URL의 state값이 정의 되지 않아서다.
state가 생성되려면 Home 화면을 먼저 열어야 한다.
//coins component
import { Link } from "react-router-dom";
function Coins() {
return (
<Link to={`/${coin.id}`} state={{ name: coin.name }}></Link>
// to로 설정된 Url로 state를 보낸다.
);
}
export default Coins;
//coin component
import { useState } from "react";
import { useLocation } from "react-router-dom";
interface LocationParams {
state: {
name: string;
};
}
function Coin() {
const { state } = useLocation() as LocationParams;
return (
<>
<div>{state.name}</div>
//사용❌, TypeError:Cannot read properties of undefined(reading name)
<div>{state?.name || "Loading..."}</div>
// 해결 방법: 새탭에서 상세화면 URL을 입력하여 화면을 들어오면 Loading화면을
보게 만들어 주었다. // 결론 : Home화면을 통해서 들어온다면, Link로 해당 URL로
이동하기 때문에 Home에서 가져온 state값을 볼 수 있을 것이다.
</>
);
}
export default Coin;
URL의 마지막이나 중간에 데이터를 전송하는 것
/profiles/adam
→ adam 부분을 데이터처럼 변경하면서 사용할 수 있는데 URL Parameter라고 한다.
dynamic URL parameter 처리시 ':'를 붙여 준다.
<Route path ="/profiles/:이름" element={<Day />}></Route>
URL 뒤에 ? 를 추가하고 이름 과 값을 전달할 때 사용
profiles?name=adam&email=itstudy@kakao.com
Query String 예시)
Localhost:3001/words?day=1
을 하면 1일치에 해당 하는 단어를 가져오는 것도 가능하다.
Router 내부에 다시 Router를 만드는 것
1) 만드는 방법
Outlet
을 이용해서 구현 - 한 번만 설정하면 된다.index라는 porps가 존재하는데 이 props가 "/" 이다 (보통 index를 적어준다.)🔥
<Route path='/' element={<Home />}
<Route index element={<Home />}>
1) useNavigate