react-router v4에서 쿼리 매개 변수를 얻는 방법


87

내 프로젝트에서 react-router-dom 4.0.0-beta.6을 사용하고 있습니다. 다음과 같은 코드가 있습니다.

<Route exact path="/home" component={HomePage}/>

그리고 HomePage구성 요소 에서 쿼리 매개 변수를 얻고 싶습니다 . location.search다음과 같은 param을 찾았 ?key=value으므로 구문 분석되지 않았습니다.

react-router v4로 쿼리 매개 변수를 얻는 올바른 방법은 무엇입니까?

답변:


181

쿼리 문자열을 구문 분석하는 기능은 여러 가지 구현을 지원하라는 요청이 수년에 걸쳐 있었기 때문에 V4에서 제외되었습니다. 이를 통해 팀은 사용자가 구현 방식을 결정하는 것이 가장 좋을 것이라고 결정했습니다. 쿼리 문자열 lib를 가져 오는 것이 좋습니다. 여기 내가 사용하는

const queryString = require('query-string');

const parsed = queryString.parse(props.location.search);

new URLSearchParams네이티브를 원하고 필요에 맞게 작동 하는 경우 에도 사용할 수 있습니다.

const params = new URLSearchParams(props.location.search);
const foo = params.get('foo'); // bar

여기 에서 결정에 대해 자세히 읽을 수 있습니다.


12
폴리 필없이 URLSearchParams를 사용하지 마십시오. 2018 년 3 월부터 Googlebot은 URLSearchParams를 지원하지 않는 Chrome 41 ( developers.google.com/search/docs/guides/rendering )을 사용하며 중요한 경로 ( caniuse.com/#feat=urlsearchparams ) 에서 사용하면 앱이 중단됩니다 .
Joshua Robinson

12

주어진 대답은 확실합니다.

query-string 대신 qs 모듈 을 사용하려는 경우 (인기면에서 거의 동일 함) 다음은 구문입니다.

const query = qs.parse(props.location.search, {
  ignoreQueryPrefix: true
})

ignoreQueryPrefix의 옵션은 최고의 물음표를 무시하는 것입니다.


1
좋은. 2019 년 1 월, qs는 쿼리 문자열의 경우 270 만 건에 비해 매주 1,200 만 건의 다운로드를 기록했습니다.
oyalhi

6

허용되는 답변은 잘 작동하지만 추가 패키지를 설치하지 않으려면 다음을 사용할 수 있습니다.

getUrlParameter = (name) => {
    name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
    let regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
    let results = regex.exec(window.location.search);
    return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
  };

주어진 http://www.google.co.in/?key=value

getUrlParameter('key');

돌아올 것이다 value


고마워요 .. "query-string"라이브러리는 어떤 이유로 저에게 작동하지 않았지만 귀하의 솔루션은 매력적으로 작동했습니다. "react-dom": "^ 16.0.0", "react-router": "^ 4.2.0", "react-router-dom": "^ 4.2.2"및 "query-string"을 사용했습니다. "^ 5.0.1"
Rohan_Paul

이것은 쿼리 문자열에 단일 매개 변수가 있다고 가정합니다. OP는 쿼리 매개 변수를 얻는 방법을 명확하게 묻습니다. 이것이 언급 된 npm 모듈이하는 일입니다. 이것을 쿼리 문자열에서 키 / 값 쌍의 객체를 반환하는 함수로 바꾸면 정말 유용 할 것입니다 !
Andy Lorenz

@AndyLorenz 이것은 여러 쿼리 매개 변수가있는 경우에도 작동하며 값을 얻으려는 키로 주어진 함수를 호출합니다. Yes 메서드는 키 값의 맵을 제공하도록 변환 될 수도 있습니다.
kartikag01

작동하지만 @Kartik_Agarwal 좋은 솔루션은 아닙니다. (a) 본질적으로 동일한 (잠재적으로 비용이 많이 드는) 코드를 여러 번 실행해야하며, (b) 각 매개 변수에 대해 별도의 변수를 사용해야하는 반면, 이상적으로는 키 / 값 쌍의 객체를 채울 것입니다. (c) 필요 매개 변수 이름을 알고 있는지 여부를 확인하기 위해 추가로 확인해야합니다. 이것이 내 코드라면 모든 매개 변수를 반복적으로 선택할 수있는 정규식을 찾겠지만 정규식이 내 귀를 피하게 만든다는 것을 인정해야합니다!
Andy Lorenz

6

또 다른 유용한 접근 방식은 URLSearchParams이와 같이 즉시 사용하는 것입니다 .

  let { search } = useLocation();

   const query = new URLSearchParams(search);
   const paramField = query.get('field');
   const paramValue = query.get('value');

깨끗하고 읽기 쉽고 모듈이 필요하지 않습니다. 아래에 더 많은 정보가 있습니다.


5

나는 반응 라우터 v4의 매개 변수에 대해 연구하고 있었는데 반응 라우터 v2 / 3과는 달리 v4에는 사용하지 않았습니다. 나는 다른 기능을 떠날 것입니다-아마도 누군가가 도움이 될 것입니다. es6 또는 일반 자바 스크립트 만 필요합니다.

function parseQueryParams(query) {
  //You get a '?key=asdfghjkl1234567890&val=123&val2&val3=other'
  const queryArray = query.split('?')[1].split('&');
  let queryParams = {};
  for (let i = 0; i < queryArray.length; i++) {
    const [key, val] = queryArray[i].split('=');
    queryParams[key] = val ? val : true;
  }
  /* queryParams = 
     {
      key:"asdfghjkl1234567890",
      val:"123",
      val2:true,
      val3:"other"
     }
  */
  return queryParams;
}

또한이 기능을 개선 할 수 있습니다.


2

뭐라고?

queryfie(string){
    return string
        .slice(1)
        .split('&')
        .map(q => q.split('='))
        .reduce((a, c) => { a[c[0]] = c[1]; return a; }, {});
}

queryfie(this.props.location.search);

0

방금 이것을 만들었으므로 하위 버전에서 라우터 v4 이상을 반응하도록 업데이트하는 경우 전체 코드 구조 (redux 라우터 저장소에서 쿼리를 사용하는 경우)를 변경할 필요가 없습니다.

https://github.com/saltas888/react-router-query-middleware


1
솔루션에 대한 링크는 환영하지만 답변이없는 경우에도 유용한 지 확인하십시오 . 링크 주변에 컨텍스트를 추가 하여 동료 사용자가 그것이 무엇이고 왜 존재하는지 알 수 있도록 한 다음 페이지에서 가장 관련성이 높은 부분을 인용하십시오. 대상 페이지를 사용할 수없는 경우 다시 연결합니다. 링크에 불과한 답변은 삭제 될 수 있습니다 .
mrun

0

아주 쉽게

그냥 후크를 사용하십시오 useParams()

예:

라우터 :

<Route path="/user/:id" component={UserComponent} />

구성 요소에서 :

export default function UserComponent() {

  const { id } = useParams();

  return (
    <>{id}</>
  );
}

이것은 질문에 설명 된 사용 사례에서 작동하지 않습니다 (적어도 React-Router v4에서는 작동하지 않음 : reactrouter.com/web/api/Hooks/useparams ) useParams는 검색 매개 변수가 아닌 경로 매개 변수 만 노출합니다.
Bennit

-4

패키지 필요 없음 :

const params = JSON.parse(JSON.stringify(this.props.match.params));

그런 다음 다음을 사용하여 관련 매개 변수에 도달 할 수 있습니다. params.id


3
this.props.match.params경로 매개 변수가 포함 된 경우이 질문은 쿼리 매개 변수에 관한 것입니다.
Hubert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.