[解決済み] React Routerでページをリダイレクトする方法とは?[クローズド]
質問
私はReact Routerに新しいですし、ページをリダイレクトするために非常に多くの方法があることを学びます。
-
使用方法
browserHistory.push("/path")
import { browserHistory } from 'react-router'; //do something... browserHistory.push("/path");
-
使用方法
this.context.router.push("/path")
class Foo extends React.Component { constructor(props, context) { super(props, context); //do something... } redirect() { this.context.router.push("/path") } } Foo.contextTypes = { router: React.PropTypes.object }
-
React Router v4では、以下のように
this.context.history.push("/path")
とthis.props.history.push("/path")
. 詳細 React Router v4でHistoryにプッシュする方法は?
これらのオプションでとても混乱しています。ページをリダイレクトする最良の方法はありますか?
どのように解決するのですか?
実際には、ユースケースに依存します。
1) 不正なユーザからルートを保護したい。
このような場合は
<Redirect />
というコンポーネントを使用し、以下のようなロジックを実装することができます。
import React from 'react'
import { Redirect } from 'react-router-dom'
const ProtectedComponent = () => {
if (authFails)
return <Redirect to='/login' />
}
return <div> My Protected Component </div>
}
もし、あなたが
<Redirect />
を期待通りに動作させたい場合は、最終的に DOM 要素と見なされるように、コンポーネントの render メソッドの内部に配置する必要があることに注意してください。
2) 特定のアクションの後にリダイレクトしたい場合 (例えば、アイテムを作成した後)
その場合、履歴を使用することができます。
myFunction() {
addSomeStuff(data).then(() => {
this.props.history.push('/path')
}).catch((error) => {
console.log(error)
})
または
myFunction() {
addSomeStuff()
this.props.history.push('/path')
}
履歴にアクセスできるようにするには、コンポーネントを
withRouter
. コンポーネントをそれでラップすると、それは
match
location
と
history
のプロップスです。の公式ドキュメントを参照してください。
withRouter
.
もしあなたのコンポーネントが
<Route />
コンポーネントの子である場合、つまり、そのコンポーネントが
<Route path='/path' component={myComponent} />
のようなものであれば、コンポーネントを
withRouter
というのは
<Route />
パス
match
,
location
そして
history
をその子へ送る。
3) 要素をクリックした後にリダイレクトする
ここでは、2つのオプションがあります。あなたは
history.push()
に渡すことで
onClick
イベントに渡すことです。
<div onClick={this.props.history.push('/path')}> some stuff </div>
を使うか、あるいは
<Link />
コンポーネントを使うこともできます。
<Link to='/path' > some stuff </Link>
この場合の経験則としては、なるべく
<Link />
を最初に使うようにすることだと思います。特にパフォーマンスのためでしょう。
関連
-
[解決済み】プリセットファイルはオブジェクトのエクスポートができない
-
[解決済み] 非必須項目に対するYupバリデーション
-
[解決済み] ReactJS で inst.render が関数でないエラーが発生する
-
[解決済み] React QueryとReduxの主な違いは何ですか?
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み] Reactのこの3つの点は何をするところなのでしょうか?
-
[解決済み] React-routerのURLを更新したり、手動で書き込んだりするとうまくいかない
-
[解決済み] React NativeとReactの違いは何ですか?
-
[解決済み] React / React Nativeでコンストラクタを使用する場合とgetInitialStateを使用する場合の違いとは何ですか?
-
[解決済み] React Router v4で履歴にプッシュする方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プリセットファイルはオブジェクトのエクスポートができない
-
[解決済み] React テキストを挟んだ横長の仕切りを作る
-
[解決済み] reactでonloadを使うには?
-
[解決済み] Uncaught (in promise) Error: リクエストに失敗、ステータスコード404
-
[解決済み] react.jsで複数のモジュールをエクスポートする
-
[解決済み] 矢印本体を囲む予期せぬブロックステートメント
-
[解決済み] Cross-envでyarnの実行時にenv変数が変更されない。
-
[解決済み] create-react-appビルドスクリプトを実行する際に、ビルド.env変数を設定するには?
-
[解決済み] React」は定義される前に使用されていた
-
[解決済み] React Router v4で履歴にプッシュする方法は?