페이지 주소를 정의할 때 유동적인 값을 사용해야 하는 경우의 로직입니다.
example.com/profile?page=121feqtr
막 이런 식으로 url 뒤에 ? 가 붙고 유동적인 값을 넣는 형태를 쿼리스트링 주소라고 합니다.
이걸 한 번 구현해보겠습니다.
우선 다음과 같은 예제 코드를 작성합니다.
import { useParams } from "react-router-dom";
const data = {
keroro: {
name: "케로로",
description: "케로로 소대의 대장",
},
giroro: {
name: "기로로",
description: "케로로 소대의 사격수 하사",
},
};
const Profile = () => {
const params = useParams();
const profile = data[params.username];
return (
케로로 소대원
{profile ? (
{profile.name}
{profile.description}
) : (
존재하지 않는 프로필입니다.
)}
);
};
export default Profile;
저는 케로로 소대원에 관한 정보를 알려주는 Profile 컴포넌트를 제작했습니다.
이제, APP.js 로 가서 다음과 같이 작업을 합니다.
//Projile 컴포넌트 불러오기
import Profile from "./Profile";
function App() {
return (
{/* Profile 컴포넌트 사용하기 */}
} />
);
}
export default App;
URL 파라미터로 사용할 부분을 : 을 통해 지정이 가능합니다.
만약 URL 파라미터를 여러 개 이용할 계획이다?
/projiles/:username/:field 와 같은 형태로 설정할 수 있습니다.
실제 쿼리 스트링을 통해서 나타나는 페이지를 확인하기 위해 다음과 같은 예시코드를 만들었습니다.
import { Link } from "react-router-dom";
const KeroroList = () => {
return (
케로로 소대원 리스트
-
케로로 중사
-
기로로 하사
-
도로로 병장
);
};
export default KeroroList;
이 코드를 실제로 구축한다면, 해당 페이지에서 링크를 통해 각 소대원의 프로필을 볼 수 있을 겁니다.
제가 미리 data 로 지정해둔 곳에는 keroro, giroro 밖에 없으니까 도로로 병장의 프로필은 존재하지 않는 프로필이 되겠네요.
이런 식으로 실제로 나타나는 것을 볼 수 있습니다.
이번에는 라우트에서 쿼리스트링을 사용하는 방법입니다.
쿼리스트링의 사용에서는 URL 파라미터와 달리 Route 컴포넌트를 별도로 설정해야 하는 것이 없습니다.
이를 위해 다음과 같이 예제를 작성했습니다.
import { useLocation } from "react-router-dom";
const KeroroList = () => {
const location = useLocation();
return (
쿼리 스트링 테스트
쿼리스트링 : {location.search}
);
};
export default KeroroList;
이 페이지가 나타나는 본래 URL 이 example.com/list 라고 할까요?
pathname 은 example.com/list 라는 현재 주소 경로가 됩니다.
search 라는 것은 이제 이 주소 뒤에 있는 ? 문자를 포함한 모든 값들을 뜻합니다.
state 는 페이지로 이동할 때 임의로 넣을 수 있는 상태 값을 뜻합니다.
key 는 location 객체의 고유한 값으로, 초기에는 default 이지만 페이지가 변경될 때마다 고유의 값이 생성됩니다.
만약 example.com/list?detail=true&mode=1 과 같이 url 이 되어 있다면
lcoation.search 에는 ?detail=true&mode=1 전체가 할당이 됩니다.
여기서 이제 내가 원하는 key를 검색하고 값을 따로 빼내서 쓰고 싶겠죠.
이를 위해서 다음과 같이 코드를 수정할 수 있겠습니다.
import { useLocation } from "react-router-dom";
import { useSearchParams } from "react-router-dom";
const KeroroList = () => {
const [useSearchParams, setSearchParams] = useSearchParams();
const detail = setSearchParams.get("detail");
const mode = setSearchParams.get("mode");
const onToggleDetail = () => {
setSearchParams({ mode, detail: detail === "true" ? false : true });
};
const onIncreaseMode = () => {
const nextMode = mode === null ? 1 : parseInt(mode) + 1;
setSearchParams({ mode: nextMode, detail });
};
return (
라우터 테스트
detail : {detail}
mode : {mode}
);
};
export default KeroroList;
detail 과 mode 라는 값에 유동적으로 현재 url 의 쿼리스트링 값을 가져오는 것을 볼 수 있습니다.