ブラウザ環境をターゲットにしている場合はreact-router-dom
、 の代わりに packageを使用する必要がありますreact-router
。react
コア ( ) とプラットフォーム固有のコード ( react-dom
、 )を分離するために、React と同じアプローチに従っていreact-native
ますが、2 つの個別のパッケージをインストールする必要がないという微妙な違いがあるため、環境パッケージにはすべてが含まれています。あなたが必要です。次のようにプロジェクトに追加できます。
yarn add react-router-dom
また
npm i react-router-dom
最初に行う必要があるのは<BrowserRouter>
、アプリケーションの最上位の親コンポーネントとして を提供することです。<BrowserRouter>
は HTML5 history
API を使用して管理するため、自分でインスタンス化して props としてコンポーネントに渡すことについて心配する<BrowserRouter>
必要はありません (以前のバージョンで必要でした)。
V4 では、プログラムでナビゲートするには、オブジェクトにアクセスする必要があります。このオブジェクトは、アプリケーションの最上位の親としてプロバイダーコンポーネントを持っている限り、history
React を介して利用できます。ライブラリは、それ自体がプロパティとして含まれているオブジェクトをコンテキストを通じて公開します。インターフェイスには、、、 などのいくつかのナビゲーション方法が用意されています。プロパティとメソッドの全リストはこちらで確認できます。context
<BrowserRouter>
router
history
history
push
replace
goBack
Redux/Mobx ユーザーへの重要な注意事項
アプリケーションで状態管理ライブラリとして redux または mobx を使用している場合、位置を認識する必要があるにもかかわらず、URL 更新をトリガーした後に再レンダリングされないコンポーネントで問題が発生する可能性があります。
これは、コンテキスト モデルを使用してコンポーネントにreact-router
渡すために発生しています。location
connect とobserver はどちらも、 shouldComponentUpdate メソッドが現在の props と次の props の浅い比較を行うコンポーネントを作成します。これらのコンポーネントは、少なくとも 1 つのプロップが変更された場合にのみ再レンダリングされます。これは、場所が変更されたときに確実に更新されるようにするには、場所が変更されたときに変更される小道具を与える必要があることを意味します。
これを解決するための 2 つのアプローチは次のとおりです。
- 接続されたコンポーネントを pathless でラップします
<Route />
。現在のオブジェクトは、レンダリングするコンポーネントに渡すlocation
props の 1 つです。<Route>
- 接続されたコンポーネントを
withRouter
高次コンポーネントでラップします。実際には同じ効果がありlocation
、小道具として注入されます
それはさておき、プログラムでナビゲートする方法は 4 つあります。
1.-<Route>
コンポーネントの使用
宣言的なスタイルを促進します。v4 より前は、
<Route />
コンポーネントはコンポーネント階層の最上位に配置されていたため、事前にルート構造を考慮する必要がありました。ただし、ツリー内の任意の
場所<Route>
にコンポーネントを配置できるようになったため、URL に応じて条件付きレンダリングをより細かく制御できるようになりました。を挿入し、小道具としてコンポーネントに挿入します。ナビゲーション メソッド ( 、、... など) は、オブジェクトのプロパティとして使用できます。
Route
match
location
history
push
replace
goBack
history
またはprops のRoute
いずれかを使用して、 でcomponent
何かをレンダリングする方法は 3 つありますが、同じ で複数を使用しないでください。選択はユース ケースによって異なりますが、基本的に最初の 2 つのオプションは、URL の場所と一致する場合にのみコンポーネントをレンダリングしますが、パスが場所と一致するかどうかにかかわらず、コンポーネントはレンダリングされます (URL に基づいて UI を調整する場合に役立ちます)。マッチング)。render
children
Route
path
children
コンポーネントのレンダリング出力をカスタマイズする場合は、コンポーネントを関数でラップし、 オプションを使用して、 と以外のrender
必要なその他の小道具をコンポーネントに渡す必要があります。説明する例:match
location
history
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.- HoC のwithRouter
使用
この高次コンポーネントは、 と同じ props を注入し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
オブジェクトにすることができます。代わりに
履歴に新しいエントリをプッシュしたい場合は、
push
prop も渡し、それを
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,
}),
};
言うまでもなく、ブラウザ以外のエコシステム向けの他の Router コンポーネントもあります。たとえば、ナビゲーション スタックをメモリに<NativeRouter>
複製し、React Native プラットフォームをターゲットにして、パッケージから入手できます。react-router-native
詳細については、公式ドキュメントを参照してください。ライブラリの共著者の 1 人が作成したビデオもあり、 react-router v4 の非常にクールな紹介を提供し、主要な変更点のいくつかを強調しています。