プログラムでReact Router V4を使用してナビゲートする 質問する

プログラムでReact Router V4を使用してナビゲートする 質問する

react-router私はv3 から v4 に置き換えたばかりです。
しかし、メンバー関数内をプログラムでナビゲートする方法がよくわかりませんComponent。つまり、何らかのデータを処理した後にhandleClick()ナビゲートしたい関数内です/path/some/where。以前は次のようにしていました。

import { browserHistory } from 'react-router'
browserHistory.push('/path/some/where')

しかし、v4 ではそのようなインターフェースが見つかりません。v4
を使用してナビゲートするにはどうすればよいでしょうか?

ベストアンサー1

react-router-domブラウザ環境をターゲットにしている場合は、ではなくパッケージを使用する必要があります。これらは、コア ( ) とプラットフォーム固有のコード ( 、 )react-routerを分離するために、React と同じアプローチに従っていますが、微妙な違いは、2 つの個別のパッケージをインストールする必要がないため、環境パッケージに必要なものがすべて含まれているということです。プロジェクトに次のように追加できます。reactreact-domreact-native

yarn add react-router-dom

または

npm i react-router-dom

最初に行う必要があるのは、<BrowserRouter>アプリケーションの最上位の親コンポーネントとして を提供することです。は<BrowserRouter>HTML5 historyAPI を使用して を管理するので、自分でインスタンス化してコンポーネントにプロパティとして渡す必要はありません<BrowserRouter>(以前のバージョンではそうする必要がありました)。

V4 では、プログラムでナビゲートするには、アプリケーションの最上位の親としてプロバイダーコンポーネントがある限りhistory、React を通じて利用できる オブジェクトにアクセスする必要があります。ライブラリは、それ自体がプロパティとして含むオブジェクトをコンテキストを通じて公開します。インターフェイスは、、、などのいくつかのナビゲーション メソッドを提供します。プロパティとメソッドの全リストを確認できます。context<BrowserRouter> routerhistoryhistorypushreplacegoBackここ

Redux/Mobx ユーザーへの重要な注意

アプリケーションの状態管理ライブラリとしてreduxまたはmobxを使用している場合、位置を認識する必要があるコンポーネントがURL更新をトリガーした後に再レンダリングされないという問題に遭遇したことがあるかもしれません。

これは、コンテキスト モデルを使用してコンポーネントにreact-router渡されるために発生します。location

connect と observer はどちらも、shouldComponentUpdate メソッドが現在のプロパティと次のプロパティの浅い比較を実行するコンポーネントを作成します。これらのコンポーネントは、少なくとも 1 つのプロパティが変更された場合にのみ再レンダリングされます。つまり、場所が変わったときにコンポーネントが更新されるようにするには、場所が変わったときに変更されるプロパティをコンポーネントに指定する必要があります。

これを解決するための 2 つのアプローチは次のとおりです。

  • 接続されたコンポーネントをパスのない でラップします<Route />。現在のオブジェクトは、 がレンダリングするコンポーネントに渡すlocationプロパティの1つです。<Route>
  • 接続されたコンポーネントを高階コンポーネントでラップしますwithRouter。これは実際には同じ効果を持ち、locationプロパティとして注入されます。

それはさておき、プログラムでナビゲートする方法は 4 つあり、推奨順に並べると次のようになります。

1.-<Route>コンポーネントの使用

宣言型スタイルを推進します。v4 より前は、 <Route /> コンポーネントはコンポーネント階層の最上位に配置され、事前にルート構造を考慮する必要がありました。ただし、現在は ツリー内のどこにでも <Route> コンポーネント を配置できるため、URL に応じて条件付きレンダリングをより細かく制御できます。 は 、、 を props としてコンポーネントに挿入します。ナビゲーション メソッド ( 、、 など ) は、オブジェクトのプロパティとして使用できます 。 Route match location history push replace goBack history

を使用して何かをレンダリングする方法は 3 つあります。、、またはprops のRouteいずれかを使用しますが、同じ で複数の方法を使用しないでください。選択はユースケースによって異なりますが、基本的に最初の 2 つのオプションでは、 がURL の場所と一致する場合にのみコンポーネントがレンダリングされます。一方、 では、パスが場所と一致するかどうかに関係なくコンポーネントがレンダリングされます (URL の一致に基づいて UI を調整する場合に便利です)。componentrenderchildrenRoutepathchildren

コンポーネントのレンダリング出力をカスタマイズする場合は、コンポーネントを関数でラップし、オプションを使用して、、および以外の必要なプロパティをコンポーネントに渡す必要があります。説明renderのための例:matchlocationhistory

import { BrowserRouter as Router } from 'react-router-dom'

const ButtonToNavigate = ({ title, history }) => (
  <button
    type="button"
    onClick={() => history.push('/my-new-location')}
  >
    {title}
  </button>
);

const SomeComponent = () => (
  <Route path="/" render={(props) => <ButtonToNavigate {...props} title="Navigate elsewhere" />} />
)    

const App = () => (
  <Router>
    <SomeComponent /> // Notice how in v4 we can have any other component interleaved
    <AnotherComponent />
  </Router>
);

2.- withRouterHoCの使用

この高階コンポーネントは、 と同じプロパティを挿入しますRoute。ただし、ファイルごとに 1 つの HoC しか持てないという制限があります。

import { withRouter } from 'react-router-dom'

const ButtonToNavigate = ({ history }) => (
  <button
    type="button"
    onClick={() => history.push('/my-new-location')}
  >
    Navigate
  </button>
);


ButtonToNavigate.propTypes = {
  history: React.PropTypes.shape({
    push: React.PropTypes.func.isRequired,
  }),
};

export default withRouter(ButtonToNavigate);

3.-Redirectコンポーネントの使用

をレンダリングすると、 <Redirect> 新しい場所に移動します。ただし、 デフォルトでは 、サーバー側リダイレクト(HTTP 3xx)のように、現在の場所が新しい場所に置き換えられることに注意してください。新しい場所は to propによって提供され、文字列(リダイレクト先のURL)またはオブジェクトになります 。代わりに新しいエントリを履歴にプッシュし location たい場合は 、 propも渡して、次のように設定します。 push true

<Redirect to="/your-new-location" push />

4.-routerコンテキストを通じて手動でアクセスする

少しがっかりしたので コンテクスト まだ実験的なAPIであり、Reactの将来のリリースで壊れたり変更されたりする可能性がある。

const ButtonToNavigate = (props, context) => (
  <button
    type="button"
    onClick={() => context.router.history.push('/my-new-location')}
  >
    Navigate to a new location
  </button>
);

ButtonToNavigate.contextTypes = {
  router: React.PropTypes.shape({
    history: React.PropTypes.object.isRequired,
  }),
};

言うまでもなく、メモリ内の<NativeRouter>ナビゲーション スタックを複製し、パッケージを通じて利用できる React Native プラットフォームをターゲットとするルーター コンポーネントなど、ブラウザー以外のエコシステム向けの他のルーター コンポーネントもあります。react-router-native

さらに詳しい情報については、公式ドキュメントもありますビデオライブラリの共同作成者の 1 人によって作成されたもので、react-router v4 の非常にわかりやすい紹介が提供され、いくつかの主要な変更点が強調されています。

おすすめ記事