React

230119 React 라우터 URL파라미터 or 쿼리스트링

주영재 2023. 1. 19. 20:04

URL파라미터 or 쿼리스트링

같은 컴포넌트라도 전달되는 데이터에 따라서 다른 내용을 보여줘야 하는 경우가 있다.
이때 URL주소에 파라미터를 전달할 수 있고, 컴포넌트는 그 값을 받아서 사용할 수 있다.

 

 

App.js

import { Route, Routes } from "react-router-dom";
import Home from "./component/Home";
import User from "./component/User";
import Info from "./component/Info";

function App() {
  return (
    <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/user" element={<User />} />{/* 쿼리스트링 */}
        <Route path="/info/:infoNum" element={<Info />} />{/* URL파라미터 */}
    </Routes>

  );
}

export default App;

 

 

Home.js

import { Link } from "react-router-dom";

const Home = () => {
    return (
        <div>
            <h3>홈페이지</h3>

            <ul>
                <li><Link to="/user?id=aa123&age=1">회원페이지</Link></li>

                <li><Link to="/info/1">info페이지</Link></li>
                <li><Link to="/info/2">info페이지</Link></li>
                <li><Link to="/info/3">info페이지</Link></li>
	    </ul>
        </div>
    )
}

export default Home;

 


쿼리스트링

 

/경로?키=값&키=값
별도의 라우터 설정은 하지 않아도 됨.
컴포넌트에서는 useLocation()훅 or useSearchParams()훅을 사용해서 쿼리스트링을 받을 수 있음.
useLocation()이 옛날방식, useSearchParams()이 새로운 방식.
리액트에선 이 방법을 선호.

컴포넌트에서
const location=useLocation(); 객체 반환
const [객체,function]=useSearchParams(); 배열 반환


useLocation()

객체에 search에 ?부터 뒤에값이 있다. 문자열 나누기로 키와 값을 얻어야 함. 불편

 

useSearchParams()

-배열을 반환한다. [객체,function]
-첫번째 요소는 쿼리파라미터를 조회하거나 수정하는 get,set이 담긴 객체
-두번째 요소는 쿼리파라미터를 객체로 업데이트하는 함수 반환(사실 거의 쓸 일은 없을 듯)

객체.get("키")=>request.getParameter("키")와 같다.

 

User.js

import { useLocation, useSearchParams } from "react-router-dom";

const User = () => {

    //쿼리스트링으로 넘어오는 값 받기
    //1-useLocation훅
    // const location = useLocation();
    //console.log(location);//객체안에 쿼리스트링값은 분해해서 사용

    //2. -useSearchParams훅
    //배열반환 [값을 조회하거나 수정하는 get set,쿼리스트링을 업데이트하는 함수]
    const [obj,setObj]=useSearchParams();
    console.log(obj);
    // console.log(setObj);
    let id=obj.get("id"); //==request.getParameter("id")
    let age=obj.get("age");
    console.log(id,age);

    //쿼리스트링 강제로 변경하기-URL주소에 적힌 값도 바뀐다. 뒤로가기를 누르면 이전값이 나옴
    const handleClick=()=>{
        let num=parseInt(age)+1;
        setObj({id:"변경",age:num});
    }

    return (
        <div>
            <h3>유저페이지</h3>
            쿼리스트링으로 넘어온 id : {id}<br/>
            쿼리스트링으로 넘어온 age : {age}<br/>

            <button onClick={handleClick}>쿼리스트링 강제수정</button>
        </div>
    )
}

export default User;

두번째 요소인 function을 통해 쿼리스트링을 변경할 수 있다.

버튼을 누르면 +1로 인해 age값이 계속 바뀐다. 뒤로가기를 누르면 줄어든다. age가 2일때 뒤로가기를하면 처음과 같은 상태가 됨

 


URL파라미터

-URL파라미터는 주소 뒤에 /경로/값/값 의 형태로 넘어가는 매개값이다.
-라우터(<Route/>)에 추가적인 설정이 필요하다.(/주소/:키). 여러개면(/주소/:키/:키/:키/:키)
-컴포넌트에선 useParams()훅을 사용하여 URL파라미터를 받을 수 있다.

라우터에서 path='/주소:키'
링크(<Link></Link>)에서 to='/주소/값'

App.js에서

<Route path="/info/:infoNum" element={<Info />} />{/* URL파라미터 */}

 

Home.js에서

<li><Link to="/info/1">info페이지</Link></li>
<li><Link to="/info/2">info페이지</Link></li>
<li><Link to="/info/3">info페이지</Link></li>


useParams()

let param=useParams();
useParams는 객체를 반환하는데, {키:값}의 형태를 컴포넌트별로 다르게 반환한다.
따라서, param.키 로 사용할 수 있다.

 

info.js

import { useParams } from "react-router-dom";

const Info = () => {


    const data={
        1:{name:"홍길동", subject:"리액트라우터"},
        2:{name:"이순신", subject:"리액트props"},
        3:{name:"coder", subject:"리액트state"},
    }


    //useParams()
    let param = useParams();
    //console.log(param);//URL주소에 값을 키로 받아줍니다.

    const {name,subject}=data[param.infoNum];

    return (
        <div>
            <h3>info페이지</h3>
            {name}님의 데이터 {subject}
            
        </div>
    )
}

export default Info;

각 info페이지마다 다른 값이 출력됨.