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を使用していますか?
タイラーマクギニス2017年

私はバージョン3.xを使用しています
Eric Hodonsky、

1
window.location.href正式なリダイレクトに変更するだけです。
Amirhossein Mehrvarzi

2
@AmirhosseinMehrvarzi実際には何も意味しません。もっと具体的になったり、例を挙げたりできますか?また、気づいたかどうかはわかりませんが、この質問には、React&React Routerを処理するための回答がすでに受け入れられています。
Eric Hodonsky

1
@Relic if条件では、それをURLとして使用する必要があります。私は数日前に同様の問題を抱えていましたが、この方法はシンプルで効果的であることがわかりました。すぐにリダイレクトします。受け入れられた答えルーティングソリューションです(ルートアーキテクチャに違反する一方で、ルートアーキテクチャはアプリ内のナビゲーションではなく、アプリ内のナビゲーションを考慮しているため)。これは私のような環境では機能しません
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ではなく、真のネイティブアプリではない)を使用してさらに進んだときに、私が思いついた内容を確認してください。今私がやっていることは私の問題を解決する正しい方法ではありませんが、この問題を解決するために、私はあなたが私の解決策を調査す​​ることをお勧めします。
エリックホドンスキー2017年

1
これは私の心の中でそれほどきれいではありません。正直にアンカータグを使いたい。次に、ブラウザの戻るボタンをクリックすると、ルートが返され、example.zendesk.com
hc / en

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
OPは、宣言的にではなく、プログラムでそれを行う方法を尋ねていました
Eric Hodonsky 2017年

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"
  />

これが私のコンポーネントincaseです-誰もが興味があります:

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.5、4.xではそれほど単純ではありません


あなたは何もする必要がなく、反応はフレームワークであり、フレームワークには多くの価値があります。これは、反応フレームワーク内でそれを行う方法です。ただし、ここにラップされる可能性のあるブラウザー履歴モジュールは考慮されないため、さらに便利になります。また、 "window.location"は1999年に行われた方法であることに注意してください。これは、クライアント側ルーティングのためにルートテーブルに追加するための方法にすぎません。「良い」ソリューションではありません。
エリックホドンスキー2017

react -router v4では、コンポーネントの代わりにrenderを使用できます
Irrech

3
@Irrech「レンダーではなくコンポーネント」は何も意味しません。質問への回答がある場合は、それを追加して、実装方法の詳細を教えてください。
エリックホドンスキー2018

3
@MuhammadUmerまたは単にアンカータグを使用します。react-routerは、アプリケーション内でのルーティングのみを目的としています。あなたは、その設計上の決定(私が知っているに反対することができます私はそれだけで同じことを行うの、やる)が、それは「1999年に良く行って」いません。
2018年

21

反応ルーターを要求する必要はありません。このアクションはネイティブで実行でき、ブラウザによって提供されます。

ただ使う window.location

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

1
この回答は不完全であり、抽象化が許可されていないか、ルーターとの関係です
Eric Hodonsky

8
これが目標です。反応ルーターを要求する必要はありません。このアクションはネイティブで実行でき、ブラウザによって提供されます。
アラン

10

react-routerのLinkコンポーネントを使用すると、それを実行できます。「to」プロップでは、3つのタイプのデータを指定できます。

  • a string:リンクの場所の文字列表現。場所のパス名、検索、およびハッシュプロパティを連結して作成されます。
  • オブジェクト:次のプロパティのいずれかを持つことができるオブジェクト:
    • pathname:リンク先のパスを表す文字列。
    • search:クエリパラメータの文字列表現。
    • hash:URLに挿入するハッシュ。例:#a-hash。
    • state:場所に永続化する状態
  • 関数:現在の場所が引数として渡され、場所の表現を文字列またはオブジェクトとして返す関数

あなたの例(外部リンク)の場合:

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を使用していますが、ネイティブjavascriptに変換するのはかなり簡単です。

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

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でも機能する可能性があります。エリックの答えから離れて、「http」がURLに存在しないローカル開発を処理するなど、もう少し行う必要がありました。また、同じサーバー上の別のアプリケーションにリダイレクトしています。

ルーターファイルに追加:

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を使用すると、関数はでなく、react要素を返す必要があるため、エラーが発生しますvoid。だから私はルートレンダーメソッドを使って(そしてReact router v4を使って)このようにしました:

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

代わりwindow.location.assign()window.location.replace()なども使用できる場所


-2

サーバー側のレンダリングを使用している場合は、を使用できますStaticRouter。あなたの持つcontextなどpropsして、追加<Redirect path="/somewhere" />のアプリでコンポーネントを。これは、react-routerがリダイレクトコンポーネントと一致するたびに、静的ルーターに渡したコンテキストに何かを追加して、パスがリダイレクトコンポーネントと一致することを通知するという考え方です。リダイレクトがヒットしたことがわかったので、探しているリダイレクトかどうかを確認するだけです。その後、サーバーを介してリダイレクトします。ctx.redirect('https://example/com')


私はクライアントでそれを行う方法を求めています。正しく行われれば、実際にはDNSレベルで行う必要があります。2番目は、最初のサーバー要求にあります。私はS3をホストしているので、サーバー側はありません。開発者の担当者がサービスレベルでリダイレクトを実行できるようになるまで、今は行き詰まっています。
Eric Hodonsky 2017年

何ができるか<Redirect push={ true } to="/pathtoredirect" />
Rei Dien

-4

以下を使用して、react-router-domでリダイレクトを実現できました

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

私の場合、ユーザーがルートURL http://myapp.comにアクセスするたびにアプリ内の別の場所にリダイレクトする方法を探していましたhttp://myapp.com/newplace。したがって、上記が役立ちました。


2
OPは、同じアプリ内のルートではなく、外部リソースにリダイレクトしようとしていることを明確に述べています。
Neets、

明らかに、私は自分のユースケースについて具体的であり、彼がそれを彼に適用できるならそれを落としました。私の解決策は私のアプリ内で、彼は例としてそれを使うことができると言います。
walecloud 2019年

1
ユースケースを人々に紹介したい場合は、ブログを書いてください。Stackoverflowは、ユースケースではなく、人々が持っているクエリに答えるためのものです。また、ユースケースを実装する正しい方法は-<Redirect from = "/" to = {{pathname: '/ YourRoute'}} />
Abhas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.