반응 라우터 v4에서 history.push / Link / Redirect로 매개 변수를 전달하는 방법은 무엇입니까?


217

this.props.history.push('/page')React-Router v4에서 매개 변수를 어떻게 전달할 수 있습니까?

.then(response => {
       var r = this;
        if (response.status >= 200 && response.status < 300) {
             r.props.history.push('/template');
          });

a로 렌더링되는 구성 요소 Route에 액세스 할 수 있어야합니다 this.props.location, this.props.history등 당신이 사용할 필요가 없습니다 생각 refV4와 함께 더 이상. 시도해보십시오this.props.history.push('/template');
saadq

ref가 아니며, 이것을 가리키는 변수입니다. this.props.history.push ( '/ template'); 다음 페이지로 이동하지만 소품을 전달하고 싶습니다. ref = this;
IshanGarg

props경로와 일치하는 구성 요소 로 전달하려고 합니까? 이 GitHub 스레드 가 귀하의 우려를 해결 한다고 생각 합니다 .
saadq

JFYI-<a href>를 제거하고 상태를 전송하는 옵션이있는 <Link>를 추가했습니다.이 링크는 다음 페이지에서 this.props.location.state를 통해 액세스 할 수 있습니다.
Manohar Reddy Poreddy

답글 중 하나를 '답변'으로 표시해 주시겠습니까? 나는 타이핑에 시간을 보내는 사람들이 그것을 인정할 것이라고 확신합니다.
James Poulose

답변:


391

우선, 화살표 기능을 사용하기 때문에 React 컴포넌트 컨텍스트를 참조하는 콜백 자체의 컨텍스트를 참조 할 var r = this;때이 작업을 수행 할 필요는 없습니다 if statement.

문서에 따르면 :

history 객체는 일반적으로 다음과 같은 속성과 메서드를 갖습니다.

  • length-(숫자) 히스토리 스택의 항목 수
  • action-(문자열) 현재 조치 (PUSH, REPLACE 또는 POP)
  • location-(객체) 현재 위치. 다음과 같은 속성이있을 수 있습니다.

    • pathname-(문자열) URL의 경로
    • search-(문자열) URL 쿼리 문자열
    • 해시-(문자열) URL 해시 조각
    • state-(문자열) 위치 별 상태. 예를 들어이 위치가 스택으로 푸시 될 때 푸시 (경로, 상태)에 제공되었습니다. 브라우저 및 메모리 기록에서만 사용할 수 있습니다.
  • push (path, [state])-(function) 새 항목을 기록 스택에 넣습니다.
  • replace (path, [state])-(function) 기록 스택의 현재 항목을 교체합니다
  • go (n)-(함수) 히스토리 스택에서 포인터를 n 개의 항목만큼 이동합니다.
  • goBack ()-(함수) go (-1)와 동일
  • goForward ()-(함수) go (1)와 같습니다.
  • 차단 (프롬프트)-(기능) 탐색 방지

따라서 탐색하는 동안 소품을 기록 개체에 전달할 수 있습니다.

this.props.history.push({
  pathname: '/template',
  search: '?query=abc',
  state: { detail: response.data }
})

또는 유사위한 Link구성 요소 또는 Redirect구성 요소

<Link to={{
      pathname: '/template',
      search: '?query=abc',
      state: { detail: response.data }
    }}> My Link </Link>

/templateroute 로 렌더링 된 컴포넌트에서 전달 된 prop에 접근 할 수 있습니다.

this.props.location.state.detail

소품에서 히스토리 또는 위치 객체를 사용할 때는 구성 요소를와 연결해야합니다 withRouter.

문서에 따라 :

라우터

고차 컴포넌트 <Route>'s를 통해 히스토리 오브젝트의 특성 및 가장 근접한 항목에 액세스 할 수 있습니다 withRouter. withRouter render와 같은 props로 경로가 변경 될 때마다 컴포넌트를 다시 <Route>렌더링 props: { match, location, history }합니다.


3
예, 효과가있었습니다. 감사합니다! 그러나 왜 this.props.history.push('/template',response.data)작동 하지 않는지 확실 하지 않습니다. 의 문서에 따르면 push(path, [state])작동해야한다고 생각하지 않습니까?
Sanket Patel

1
감사합니다! - 내가 this.props.history.location.state.propName를 통해 내 소품 액세스 그래서 내 경우에는 내가에만 직접 역사를 통과했다
넌척

@SanketPatel이 작업을 수행해야합니다. this.props.history.push ( '/ template', {response : response.data})
Arsalan Ahmed Quershi

탐색 할 때 기록 개체에 소품을 전달할 수있는 상태 변수의 데이터를 전달하면서 새 탭에서 경로를 열 수 있습니까?
Gaurav Kumar

3
goBack ()은 어떻습니까? goBack ()으로 다시 탐색하면 props.location 또는 props.history.location에서 기록 상태를 볼 수 없습니다. push ()로 앞으로 탐색하면 잘 작동합니다.
MariusB

40

당신이 사용할 수있는,

this.props.history.push("/template", { ...response }) 또는 this.props.history.push("/template", { response: response })

/template다음 코드를 통해 구성 요소 에서 구문 분석 된 데이터에 액세스 할 수 있습니다.

const state = this.props.location.state

React Session History Management 에 대해서 더 읽어보세요.


이 논리는 history.push가 back_url 상태 인 동안 this.props.history.push (redirect_url, {back_url : '/ needing_url'}); 이 방문 페이지에서 this.props.location.state.back_url로 가져 오기
Braham Dev Yadav

24
  • 를 들어 이전 버전 :

    history.push('/path', yourData);

    다음과 같이 관련 구성 요소의 데이터를 가져옵니다.

    this.props.location.state // it is equal to yourData
  • 를 들어 새로운 버전 위의 방법은 잘 작동 하지만 새로운 방법이있다 :

    history.push({
      pathname: '/path',
      customNameData: yourData,
    });

    다음과 같이 관련 구성 요소의 데이터를 가져옵니다.

    this.props.location.customNameData // it is equal to yourData

힌트 : state키 이름은 이전 버전에서 사용되었으며 최신 버전에서는 사용자 지정 이름을 사용하여 데이터를 전달할 수 있으며 이름을 사용하는 state것이 중요하지는 않습니다.


당신이있는 경우 상태, 그것은 편리 필수적인 것은 아니다 말한다 기준, 공유하시기 바랍니다
하기 Akshay 비제이 자이나교

@AkshayVijayJain님께, 코딩 경험입니다. 나는 문서 나 심판에 근거하여 그 문장을 쓰지 않았다.
AmerllicA

21

React 후크와 함께 사용하기 위해 솔루션 확장 (Shubham Khatri에서 제안) : 16.8 이상 :

package.json (always worth updating to latest packages)

{
     ...

     "react": "^16.12.0",
     "react-router-dom": "^5.1.2",

     ...
}

히스토리 푸시로 매개 변수 전달 :

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

const FirstPage = props => {
    let history = useHistory();

    const someEventHandler = event => {
       history.push({
           pathname: '/secondpage',
           search: '?query=abc',
           state: { detail: 'some_value' }
       });
    };

};

export default FirstPage;

'react-router-dom'에서 useLocation을 사용하여 전달 된 매개 변수에 액세스 :

import { useEffect } from "react";
import { useLocation } from "react-router-dom";

const SecondPage = props => {
    const location = useLocation();

    useEffect(() => {
       console.log(location.pathname); // result: '/secondpage'
       console.log(location.search); // result: '?query=abc'
       console.log(location.state.detail); // result: 'some_value'
    }, [location]);

};

너무 감사합니다, 답변 이외의 업데이트 된 대안을 찾을 수 없습니다!
jamezrin

10

URL 매개 변수를 전달해야하는 경우

Tyler McGinnis의 사이트에 대한 훌륭한 게시물 설명이 있습니다. 포스트 링크

다음은 코드 예제입니다.

  1. history.push 구성 요소에서 :

    this.props.history.push(`/home:${this.state.userID}`)

  2. 라우터 구성 요소에서 경로를 정의합니다.

    <Route path='/home:myKey' component={Home} />

  3. 홈 컴포넌트에서 :

componentDidMount(){
    const { myKey } = this.props.match.params
    console.log(myKey )
}

이 같은 것이 있지만 페이지를 새로 고치면 완전히 충돌합니다
rabiaasif

@rabiaasif 더 이상 데이터가 없기 때문에 데이터를 유지하거나 로컬 스토리지에 저장해야합니다.
Drew Cordano

3

라우터와 함께 사용할 필요는 없습니다. 이것은 나를 위해 작동합니다 :

부모 페이지에서

<BrowserRouter>
   <Switch>
        <Route path="/routeA" render={(props)=> (
          <ComponentA {...props} propDummy={50} />
        )} />

        <Route path="/routeB" render={(props)=> (
          <ComponentB {...props} propWhatever={100} />
          )} /> 
      </Switch>
</BrowserRouter>

그런 다음 ComponentA 또는 ComponentB에서 액세스 할 수 있습니다

this.props.history

this.props.history.push 메소드를 포함한 객체.


나는 당신이 withRouter당신의 컴포넌트를로 감싸서 필요하지 않다고 생각한다 BrowserRouter.
Pie 'Oh'Pah

예, 소품 props을 포함하는 각 구성 요소에 아래로 전달합니다 history.
제레미

2

React 16.8+ (withHooks) 를 사용하려면 다음과 같이 사용할 수 있습니다

import React from 'react';
import { useHistory } from 'react-router-dom';

export default function SomeFunctionalComponent() {
let history = useHistory(); // should be called inside react component

const handleClickButton = () => {    
"funcionAPICALL"
       .then(response => {
             if (response.status >= 200 && response.status < 300) {
                 history.push('/template');
              });
}

return ( <div> Some component stuff 
    <p>To make API POST request and redirect to "/template" click a button API CALL</p>
    <button onClick={handleClickButton}>API CALL<button>
</div>)
} 

자세한 내용은 여기를 참조 하십시오 https://reacttraining.com/react-router/web/example/auth-workflow


-12

정보에 추가하여 쿼리 매개 변수를 얻습니다.

const queryParams = new URLSearchParams(this.props.location.search);
console.log('assuming query param is id', queryParams.get('id');

URLSearchParams에 대한 자세한 내용은이 링크를 참조하십시오 URLSearchParams


1
이것은 React Router 4와 전혀 관련이 없습니다.
Colby Cox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.