React-Router 외부 링크


113

react-router를 사용하여 반응 앱에서 내 경로를 처리하고 있기 때문에 외부 리소스로 리디렉션하는 방법이 있는지 궁금합니다.

누군가가 맞았다 고 말하십시오.

example.com/privacy-policy

다음으로 리디렉션하고 싶습니다.

example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies

내 index.html에서 일반 JS로 작성하는 것을 피하는 데 정확히 도움이되지 않습니다.

if ( window.location.path === "privacy-policy" ){
  window.location = "example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies"
}

어떤 React Router를 사용하고 있습니까?
Tyler McGinnis 2017 년

저는 3.x 버전을 사용하고 있습니다
Eric Hodonsky

1
window.location.href공식 리디렉션을 갖도록 변경 하기 만하면 됩니다.
Amirhossein Mehrvarzi

2
@AmirhosseinMehrvarzi는 실제로 아무것도 의미하지 않습니다. 좀 더 구체적이거나 예를 들어 주시겠습니까? 또한 당신이 눈치 챘는지 확실하지 않지만이 질문에는 이미 질문에 관한 React & React Router를 다루는 수락 된 답변이 있습니다.
Eric Hodonsky 2019 년

1
@Relic 당신은 당신의 if 조건에서 URL로 사용해야합니다. 나는 며칠 전에 비슷한 문제가 있었고 이것이 간단하고 효과적이라는 것을 알았습니다. 즉시 리디렉션됩니다. 허용 대답은 A는 라우팅 솔루션 (이 경로 아키텍처가 있음을 고려, 경로 원칙을 위반하는 동안 앱 내부 탐색 광산과 같은 어떤 환경에 대한 작업을하지 않는되지 외부 용)
Amirhossein Mehrvarzi

답변:


170

다음은 React Router를 사용하여 외부 링크로 리디렉션하는 한 줄입니다.

<Route path='/privacy-policy' component={() => { 
     window.location.href = 'https://example.com/1234'; 
     return null;
}}/>

React 순수한 구성 요소 개념을 사용하여 구성 요소의 코드를 렌더링하는 대신 브라우저를 외부 URL로 리디렉션하는 단일 함수로 줄입니다.

React Router 3과 4에서 모두 작동합니다.


2
이것은 작동하지만 더 우아하고 확장 가능한 솔루션을 찾고있었습니다. MobileApps 등 (ReactNative가 아닌 진정한 네이티브 앱)에 대한 리디렉션으로 더 나아갈 수 있었기 때문에 내가 무엇을 생각해 냈는지 확인하십시오. 이제 내가하는 일은 내 문제를 해결하는 올바른 방법이 아니지만,이 문제를 해결하기 위해 다른 관점이 아니라면 내 솔루션도 조사 할 것을 제안합니다.
에릭 Hodonsky

1
이것은 내 마음 속에서 그렇게 깨끗하지 않습니다. 정직하게 앵커 태그를 사용하고 싶습니다. 둘째, 브라우저에서 뒤로 버튼을 누르면 경로가 반환되고 다시 example.zendesk.com/hc/en-us/articles/…
Jonathan Rys 2017-09-06

11
더 나은 뒤로 버튼 동작 (응용 프로그램 확인)을 위해 window.location.replace ( ' example.com' ) 사용
MattC

1
답변이 없습니다. 원래 게시물은 301 또는 302 유형의 진정한 리디렉션 지원이 없다는 것을 알고 있지만 클라이언트 리디렉션에 대해서만 질문했습니다.
Eric Hodonsky

50

<Link />react-router의 구성 요소 를 사용할 필요가 없습니다 .

외부 링크로 이동하려면 앵커 태그를 사용하십시오.

<a target="_blank" href="https://meetflo.zendesk.com/hc/en-us/articles/230425728-Privacy-Policies">Policies</a>

20
영업은하지 선언적 프로그래밍을 수행하는 방법을 요구했다
에릭 Hodonsky

13
무관하고 오해의 소지가있는 답변.
Priya Ranjan Singh

1
이것을 사용 rel="noopener noreferrer"하는 경우<a>
S ..

5
좋은 대답은 모든 사람이 제대로 작동하는 한 신경 쓰지 않을 것입니다.
FrankByte.com

39

나는 실제로 내 자신의 구성 요소를 구축했습니다. 요소 <Redirect> 에서 정보를 가져와 react-router내 경로에 보관할 수 있습니다. 예 :

<Route
  path="/privacy-policy"
  component={ Redirect }
  loc="https://meetflo.zendesk.com/hc/en-us/articles/230425728-Privacy-Policies"
  />

다음은 내 구성 요소입니다.

import React, { Component } from "react";

export class Redirect extends Component {
  constructor( props ){
    super();
    this.state = { ...props };
  }
  componentWillMount(){
    window.location = this.state.route.loc;
  }
  render(){
    return (<section>Redirecting...</section>);
  }
}

export default Redirect;

편집-참고 : 이것은 react-router: 3.0.54.x에서 그렇게 간단하지 않습니다.


당신은 아무것도 할 필요가없고 반응은 프레임 워크이며 프레임 워크에는 많은 가치가 있습니다. 이것은 반응 프레임 워크 내에서 수행하는 방법입니다. 그러나 여기에 래핑 될 수있는 브라우저 히스토리 모듈을 고려하지 않아 더욱 유용합니다. 또한 "window.location"은 1999 년에 수행 된 방법입니다. 이것은 클라이언트 측 라우팅을 위해 경로 테이블에 추가하는 방법 일뿐입니다. "좋은"솔루션이 아닙니다.
에릭 Hodonsky

-router V4 반응에 대신 구성 요소 렌더링 사용할 수 있습니다
Irrech

3
@Irrech "render instead component"는 아무것도 의미하지 않습니다. 질문에 대한 답이 있으면 추가하고 구현 방법에 대한 세부 정보를 제공하십시오.
Eric Hodonsky

3
@MuhammadUmer 또는 앵커 태그를 사용하십시오. react-router는 응용 프로그램 내에서 라우팅하기위한 것입니다. 당신은 디자인 결정 (내가 아는 동의 할 수 그냥 같은 일을 것, 할), 그러나 "1999 년에 더 잘"아니에요.
worc

21

반응 라우터를 요청할 필요가 없습니다. 이 작업은 기본적으로 수행 할 수 있으며 브라우저에서 제공합니다.

그냥 사용 window.location

class RedirectPage extends React.Component {
  componentDidMount(){
    window.location.replace('http://www.google.com')
  }
}

1
이 답변은 추상화를 허용하지 않는, 불완전 또는 라우터 관련의
에릭 Hodonsky

8
이것이 목표입니다. 반응 라우터를 요청할 필요가 없습니다. 이 작업은 기본적으로 수행 할 수 있으며 브라우저에서 제공합니다.
Alan

10

react-router의 Link 구성 요소를 사용하면 그렇게 할 수 있습니다. " to "prop에서 3 가지 유형의 데이터를 지정할 수 있습니다.

  • a string : 위치의 경로 이름, 검색 및 해시 속성을 연결하여 만든 링크 위치의 문자열 표현입니다.
  • an object : 다음 속성 중 하나를 가질 수있는 개체입니다.
    • pathname : 연결할 경로를 나타내는 문자열입니다.
    • search : 쿼리 매개 변수의 문자열 표현입니다.
    • hash : URL에 넣을 해시, 예 : # a-hash.
    • state : 위치에 유지할 상태 입니다.
  • a function : 현재 위치가 인수로 전달되고 위치 표현을 문자열 또는 객체로 반환해야하는 함수

예를 들어 (외부 링크) :

https://example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies

다음을 수행 할 수 있습니다.

<Link to={{ pathname: "https://example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies" }} target="_blank" />

제목, ID, 클래스 이름 등과 같이 원하는 소품을 전달할 수도 있습니다.


1
이것은 가장 간단한 해결책이며 잘 작동합니다.
hPNJ7MHTyg

5

여기에있는 정보 중 일부를 사용하여 경로 선언 내에서 사용할 수있는 다음 구성 요소를 생각해 냈습니다. React Router v4와 호환됩니다.

typescript를 사용하고 있지만 네이티브 자바 스크립트로 변환하는 것은 매우 간단합니다.

interface Props {
  exact?: boolean;
  link: string;
  path: string;
  sensitive?: boolean;
  strict?: boolean;
}

const ExternalRedirect: React.FC<Props> = (props: Props) => {
  const { link, ...routeProps } = props;

  return (
    <Route
      {...routeProps}
      render={() => {
        window.location.replace(props.link);
        return null;
      }}
    />
  );
};

다음과 함께 사용 :

<ExternalRedirect
  exact={true}
  path={'/privacy-policy'}
  link={'https://example.zendesk.com/hc/en-us/articles/123456789-Privacy-Policies'}
/>

2

나는 이것으로 운이 좋았다.

  <Route
    path="/example"
    component={() => {
    global.window && (global.window.location.href = 'https://example.com');
    return null;
    }}
/>

1

React-Router가이 지원을 제공한다고 생각하지 않습니다. 문서는 언급

<Redirect>는 이전 URL을 유지하기 위해 애플리케이션의 다른 경로로 리디렉션을 설정 합니다.

대신 React-Redirect 와 같은 것을 사용해 볼 수 있습니다.


1

Alan의 대답을 확장하려면 'http :'또는 'https :'를 포함하는 "to"속성이있는 <Route/>모든 <Link/>'을 올바른 외부 리소스로 리디렉션하는를 만들 수 있습니다 .

아래는 <Router>.

<Route path={['/http:', '/https:']} component={props => {
  window.location.replace(props.location.pathname.substr(1)) // substr(1) removes the preceding '/'
  return null
}}/>

0

V3의 경우, V4에서 작동 할 수 있습니다. Eric의 대답에서 벗어나 URL에 'http'가없는 지역 개발을 처리하는 것과 같이 조금 더해야했습니다. 또한 동일한 서버의 다른 응용 프로그램으로 리디렉션하고 있습니다.

라우터 파일에 추가 :

import RedirectOnServer from './components/RedirectOnServer';

       <Route path="/somelocalpath"
          component={RedirectOnServer}
          target="/someexternaltargetstring like cnn.com"
        />

그리고 구성 요소 :

import React, { Component } from "react";

export class RedirectOnServer extends Component {

  constructor(props) {
    super();
    //if the prefix is http or https, we add nothing
    let prefix = window.location.host.startsWith("http") ? "" : "http://";
    //using host here, as I'm redirecting to another location on the same host
    this.target = prefix + window.location.host + props.route.target;
  }
  componentDidMount() {
    window.location.replace(this.target);
  }
  render(){
    return (
      <div>
        <br />
        <span>Redirecting to {this.target}</span>
      </div>
    );
  }
}

export default RedirectOnServer;

-1

Typescript와 함께 React를 사용하면 함수가 void. 그래서 저는 Route render 메서드를 사용하고 React router v4를 사용하여 이렇게했습니다.

redirectToHomePage = (): null => {
    window.location.reload();
    return null;
  };    
<Route exact path={'/'} render={this.redirectToHomePage} />

대신도 사용할 수있는 경우 window.location.assign(), window.location.replace()


-2

서버 측 렌더링을 사용하는 경우 StaticRouter. contextas를 사용하여 앱에 구성 요소 props를 추가 <Redirect path="/somewhere" />하십시오. 아이디어는 react-router가 리디렉션 구성 요소와 일치 할 때마다 정적 라우터에 전달한 컨텍스트에 무언가를 추가하여 경로가 리디렉션 구성 요소와 일치 함을 알려줍니다. 이제 리디렉션에 도달했음을 알게되었으므로 찾고있는 리디렉션인지 확인해야합니다. 그런 다음 서버를 통해 리디렉션하십시오. ctx.redirect('https://example/com').


나는 클라이언트에서 그것을 할 방법을 요청하고 있습니다. 올바르게 수행되면 실제로 DNS 수준에서 수행되어야합니다. 두 번째는 초기 서버 요청에 있습니다. S3에서 호스팅하고 있으므로 서버 측이 없습니다. 그래서 우리 dev-ops 담당자가 서비스 수준에서 리디렉션을 수행 할 수있을 때까지 지금은 멈춰 있습니다.
Eric Hodonsky

당신이 할 수있는 일은이다<Redirect push={ true } to="/pathtoredirect" />
레이 디엔

-4

다음을 사용하여 react-router-dom에서 리디렉션을 수행 할 수있었습니다.

<Route exact path="/" component={() => <Redirect to={{ pathname: '/YourRoute' }} />} />

제 경우에는 사용자가 루트 URL http://myapp.com을 방문 할 때마다 앱 내의 다른 곳 으로 리디렉션하는 방법을 찾고있었습니다 http://myapp.com/newplace. 그래서 위의 도움이되었습니다.


2
OP는 그가 동일한 앱 내부의 경로가 아닌 외부 리소스로 리디렉션을 시도하고 있음을 분명히 나타냅니다.
Neets

분명히, 나는 내 사용 사례에 대해 구체적이고 그가 적용 할 수 있다면 그것을 삭제했습니다. 내 솔루션은 내 앱 내에서 그것을 예로 사용할 수 있다고 말합니다.
walecloud

1
사람들에게 사용 사례를 보여주고 싶다면 블로그를 작성하십시오. Stackoverflow는 사용 사례가 아닌 사람들이 가진 쿼리에 응답하기위한 것입니다. 또한 사용 사례를 구현하는 올바른 방법은-<Redirect from = "/"to = {{pathname : '/ YourRoute'}} />
Abhas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.