[解決済み] react-routerでルート変更を検出する
質問
閲覧履歴に応じたビジネスロジックを実装する必要があります。
やりたいことは、こんな感じです。
reactRouter.onUrlChange(url => {
this.history.push(url);
});
URLが更新されたときにreact-routerからコールバックを受け取る方法はありますか?
解決方法は?
を使用することができます。
history.listen()
という関数を使って、経路の変更を検出することができます。を使用していることを考慮すると
react-router v4
でコンポーネントを囲みます。
withRouter
にアクセスできるようにするためのHOC
history
プロパティを使用します。
history.listen()
は
unlisten
関数を使用します。これを利用して
unregister
をリスニングから削除します。
のようにルートを設定することができます。
index.js
ReactDOM.render(
<BrowserRouter>
<AppContainer>
<Route exact path="/" Component={...} />
<Route exact path="/Home" Component={...} />
</AppContainer>
</BrowserRouter>,
document.getElementById('root')
);
で、その後に AppContainer.js
class App extends Component {
componentWillMount() {
this.unlisten = this.props.history.listen((location, action) => {
console.log("on route change");
});
}
componentWillUnmount() {
this.unlisten();
}
render() {
return (
<div>{this.props.children}</div>
);
}
}
export default withRouter(App);
履歴から ドキュメント :
を使えば、現在地への変更をリッスンすることができます。
history.listen
:history.listen((location, action) => { console.log(`The current URL is ${location.pathname}${location.search}${location.hash}`) console.log(`The last navigation action was ${action}`) })
ロケーションオブジェクトは、window.location のサブセットを実装しています。 インターフェイスを含む。
**location.pathname** - The path of the URL **location.search** - The URL query string **location.hash** - The URL hash fragment
また、ロケーションは以下のプロパティを持つことができる。
場所.状態 - URLに存在しない、この場所のための余分な状態(サポートされているのは
createBrowserHistory
とcreateMemoryHistory
)
location.key
- この場所を表す一意の文字列(サポート でcreateBrowserHistory
とcreateMemoryHistory
)アクションは以下のいずれかです。
PUSH, REPLACE, or POP
ユーザがどのように 現在のURLに到達した。
react-router v3 を使用している場合、以下の機能を利用することができます。
history.listen()
から
history
パッケージを使用することもできます。
browserHistory.listen()
のようにルートを設定し、使用することができます。
import {browserHistory} from 'react-router';
class App extends React.Component {
componentDidMount() {
this.unlisten = browserHistory.listen( location => {
console.log('route changes');
});
}
componentWillUnmount() {
this.unlisten();
}
render() {
return (
<Route path="/" onChange={yourHandler} component={AppContainer}>
<IndexRoute component={StaticContainer} />
<Route path="/a" component={ContainerA} />
<Route path="/b" component={ContainerB} />
</Route>
)
}
}
関連
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み] React-routerのURLを更新したり、手動で書き込んだりするとうまくいかない
-
[解決済み] setStateを呼び出さずにReactコンポーネントを強制的に再レンダリングすることは可能ですか?
-
[解決済み] Reactで要素を表示・非表示にする
-
[解決済み] Reactコンポーネント外でのクリックを検出する
-
[解決済み] React Router v4で履歴にプッシュする方法は?
-
[解決済み] react-router - ハンドラコンポーネントにpropsを渡す
-
[解決済み】オプションのパスパラメータを持つReact Router
-
[解決済み】react router v4 / v5でネストされたルート
-
[解決済み】react-router vs react-router-dom、いつどちらかを使うか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Typescript react - モジュール ''react-materialize'' の宣言ファイルが見つかりませんでした。'path/to/module-name.js' は暗黙のうちに any 型を持ちます。
-
[解決済み] React テキストを挟んだ横長の仕切りを作る
-
[解決済み] ReactJS giving error Uncaught TypeError: Super expression は null か関数でなければならず、undefined ではありません。
-
[解決済み] Webpack + Babelです。プリセット "es2015 "がディレクトリに相対して見つからなかった
-
[解決済み] React-Router 4 キャッチオールルート
-
[解決済み] react nativeで関数だらけのヘルパーファイルを作成する方法は?
-
[解決済み] カスタマイズ素材UI チェックした場合としない場合の切り替え
-
[解決済み] React JSでは、状態を直接変異させない、setState() react/no-direct-mutation-stateを使用する。
-
[解決済み] validateDOMNesting警告React
-
[解決済み] AxiosにCORSの問題が発生