react-router 해시 조각에서 쿼리 매개 변수 가져 오기


112

클라이언트 측에서 내 응용 프로그램에 react 및 react-router를 사용하고 있습니다. 다음과 같은 URL에서 다음 쿼리 매개 변수를 가져 오는 방법을 알아낼 수없는 것 같습니다.

http://xmen.database/search#/?status=APPROVED&page=1&limit=20

내 경로는 다음과 같습니다 (내가 아는 경로는 완전히 잘못되었습니다).

var routes = (
<Route>
    <DefaultRoute handler={SearchDisplay}/>
    <Route name="search" path="?status=:status&page=:page&limit=:limit" handler={SearchDisplay}/>
    <Route name="xmen" path="candidate/:accountId" handler={XmenDisplay}/>
</Route>
);

내 경로는 잘 작동하지만 원하는 매개 변수를 얻기 위해 경로 형식을 지정하는 방법을 잘 모르겠습니다. 이것에 대한 도움을 주셔서 감사합니다!


나는 통해 주위를 둘러 보았다 및 구성 요소 내에서 쿼리 문자열 매개 변수를 추출하는 예를 찾아에만 수 있었다getCurrentQuery
코리 다니엘


willTransitionTo핸들러 에서 후크를 사용할 수 있습니다 . 쿼리 문자열 매개 변수를받습니다. github.com/rackt/react-router/commit/…
Cory Danielson

전환 후크에 대한 문서도 여기에 있습니다. github.com/rackt/react-router/blob/master/docs/api/components/… 이 질문을 파악한 후에는 솔루션으로이 질문에 답해야합니다. 나는 당신이이 상황에 부딪 치는 마지막 사람이 아닐 것이라고 확신합니다.
Cory Danielson

답변:


133

참고 : 댓글에서 복사 / 붙여 넣기. 원래 게시물을 좋아하십시오!

es6로 작성하고 react 0.14.6 / react-router 2.0.0-rc5를 사용합니다. 이 명령을 사용하여 구성 요소에서 쿼리 매개 변수를 조회합니다.

this.props.location.query

URL에서 사용 가능한 모든 쿼리 매개 변수의 해시를 생성합니다.

최신 정보:

React-Router v4의 경우 this answer를 참조하십시오 . 기본적으로 this.props.location.search쿼리 문자열을 가져오고 query-string패키지 또는 URLSearchParams로 구문 분석하는 데 사용 합니다 .

const params = new URLSearchParams(paramsString); 
const tags = params.get('tags');

2
그것은 더 이상 다음 2.x에서 //// 반작용 라우터를 1.x에서의 같은 방법입니다
피터 아론 전신 타이즈

7
Peter에 따르면이 예는 오래되었습니다. stackoverflow.com/a/35005474/298073
btown

2
query라우터 4. 반작용에 간 것 같다 github.com/ReactTraining/react-router/issues/...
성 조

57

OLD (v4 이전) :

es6로 작성하고 react 0.14.6 / react-router 2.0.0-rc5를 사용합니다. 이 명령을 사용하여 구성 요소에서 쿼리 매개 변수를 조회합니다.

this.props.location.query

URL에서 사용 가능한 모든 쿼리 매개 변수의 해시를 생성합니다.

업데이트 (React Router v4 +) :

React Router 4의 this.props.location.query가 제거되었습니다 (현재 v4.1.1 사용). https://github.com/ReactTraining/react-router/issues/4410

자신의 방법을 사용하여 쿼리 매개 변수를 구문 분석하기를 원하는 것 같습니다. 현재이 라이브러리를 사용하여 간격을 메우려면 https://github.com/sindresorhus/query-string


2
React 0.14.8로 테스트했으며 답변이 렌더링되지 않습니다. error : TypeError: Cannot read property 'location' of undefined: |
Thomas Modeneis

3
안녕하세요 @ThomasModeneis, 이것이 라우터가 렌더링하는 최상위 상위 구성 요소입니까? 아니면 하위 구성 요소입니까? 내가 올바르게 기억한다면 라우터가 렌더링 한 부모 구성 요소에서 this.props.location.query를 자식 구성 요소로 전달해야합니다.
Marrs

55

위의 답변은 작동하지 않습니다 react-router v4 . 문제를 해결하기 위해 제가 한 작업은 다음과 같습니다.

먼저 구문 분석에 필요한 쿼리 문자열 을 설치 합니다 .

npm install -save query-string

이제 라우팅 된 구성 요소에서 다음과 같이 구문 분석되지 않은 쿼리 문자열에 액세스 할 수 있습니다.

this.props.location.search

콘솔에 로그인하여 교차 확인할 수 있습니다.

마지막으로 쿼리 매개 변수에 액세스하기 위해 구문 분석

const queryString = require('query-string');
var parsed = queryString.parse(this.props.location.search);
console.log(parsed.param); // replace param with your own 

따라서 쿼리가 ?hello=world

console.log(parsed.hello) 기록합니다 world


16
또는 lib없이 : const query = new URLSearchParams(props.location.search); console.log(query.get('hello'));(이전 브라우저의 경우 polyfill 필요).
Ninh Pham

이것은 내가 응용 프로그램을 빌드 할 때 작동 할 것입니다.
Walter

16

업데이트 2017.12.25

"react-router-dom": "^4.2.2"

다음과 같은 URL

BrowserHistory: http://localhost:3000/demo-7/detail/2?sort=name

HashHistory: http://localhost:3000/demo-7/#/detail/2?sort=name

쿼리 문자열 의존성 :

this.id = props.match.params.id;
this.searchObj = queryString.parse(props.location.search);
this.from = props.location.state.from;

console.log(this.id, this.searchObj, this.from);

결과 :

2 {sort: "name"} home


"react-router": "^2.4.1"

다음과 같은 URL http://localhost:8080/react-router01/1?name=novaline&age=26

const queryParams = this.props.location.query;

queryParams는 쿼리 매개 변수를 포함하는 객체입니다. {name: novaline, age: 26}


이 같은 경우 : http://localhost:8090/#access_token=PGqsashgJdrZoU6hV8mWAzwlXkJZO8ImDcn&expires_in=7200&token_type=bearer(예 : 없음 /후를 #다음)를 위해 사용한다 라우터 V4 반응 location.hash대신에location.search
codeVerine

10

stringquery 패키지 사용 :

import qs from "stringquery";

const obj = qs("?status=APPROVED&page=1limit=20");  
// > { limit: "10", page:"1", status:"APPROVED" }

쿼리 문자열 패키지 사용 :

import qs from "query-string";
const obj = qs.parse(this.props.location.search);
console.log(obj.param); // { limit: "10", page:"1", status:"APPROVED" } 

패키지 없음 :

const convertToObject = (url) => {
  const arr = url.slice(1).split(/&|=/); // remove the "?", "&" and "="
  let params = {};

  for(let i = 0; i < arr.length; i += 2){
    const key = arr[i], value = arr[i + 1];
    params[key] = value ; // build the object = { limit: "10", page:"1", status:"APPROVED" }
  }
  return params;
};


const uri = this.props.location.search; // "?status=APPROVED&page=1&limit=20"

const obj = convertToObject(uri);

console.log(obj); // { limit: "10", page:"1", status:"APPROVED" }


// obj.status
// obj.page
// obj.limit

희망 :)

즐거운 코딩 되세요!


5
"react-router-dom": "^5.0.0",

다음과 같은 URL 주소가있는 구성 요소에만 추가 모듈을 추가 할 필요가 없습니다.

http : // localhost : 3000 / # /? authority '

다음과 같은 간단한 코드를 시도해 볼 수 있습니다.

    const search =this.props.location.search;
    const params = new URLSearchParams(search);
    const authority = params.get('authority'); //

4

다른 답변을 읽은 후 (처음에는 @ duncan-finney, 그 다음에는 @Marrs)이 문제를 해결하는 관용적 react-router 2.x 방식을 설명하는 변경 로그를 찾기 시작했습니다. 구성 요소에서 위치 (쿼리에 필요한)를 사용하는 방법에 대한 문서 는 실제로 실제 코드와 모순됩니다. 따라서 그들의 조언을 따르면 다음과 같은 큰 경고를 받게됩니다.

Warning: [react-router] `context.location` is deprecated, please use a route component's `props.location` instead.

위치 유형을 사용하는 위치라는 컨텍스트 속성을 가질 수 없다는 것이 밝혀졌습니다. 그러나 위치 유형을 사용하는 loc이라는 컨텍스트 속성을 사용할 수 있습니다. 따라서 솔루션은 다음과 같이 소스를 약간 수정 한 것입니다.

const RouteComponent = React.createClass({
    childContextTypes: {
        loc: PropTypes.location
    },

    getChildContext() {
        return { location: this.props.location }
    }
});

const ChildComponent = React.createClass({
    contextTypes: {
        loc: PropTypes.location
    },
    render() {
        console.log(this.context.loc);
        return(<div>this.context.loc.query</div>);
    }
});

또한 자녀에게 원하는 위치 개체의 일부만 전달하면 동일한 이점을 얻을 수 있습니다. 개체 유형을 변경하라는 경고는 변경되지 않았습니다. 도움이 되었기를 바랍니다.


1

간단한 js 솔루션 :

queryStringParse = function(string) {
    let parsed = {}
    if(string != '') {
        string = string.substring(string.indexOf('?')+1)
        let p1 = string.split('&')
        p1.map(function(value) {
            let params = value.split('=')
            parsed[params[0]] = params[1]
        });
    }
    return parsed
}

다음을 사용하여 어디에서나 전화를 걸 수 있습니다.

var params = this.queryStringParse(this.props.location.search);

도움이 되었기를 바랍니다.


0

쿼리 문자열 모듈을 사용할 때 최적화 된 프로덕션 빌드를 만드는 동안 다음 오류가 발생할 수 있습니다 .

이 파일에서 코드를 축소하지 못했습니다 : ./node_modules/query-string/index.js:8

이를 극복하려면 빌드를 실행하는 동안 문제없이 동일한 프로세스를 잘 수행하는 stringquery 라는 대체 모듈을 친절하게 사용하십시오 .

import querySearch from "stringquery";

var query = querySearch(this.props.location.search);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.