[解決済み] react-router 子コンポーネントでthis.props.locationを取得する。
質問
私の理解では
<Route path="/" component={App} />
は
App
のようなルーティング関連のプロップは
location
と
params
. もし、私の
App
コンポーネントが多くのネストされた子コンポーネントを持つ場合、子コンポーネントがこれらのプロップにアクセスできるようにするにはどうすればよいでしょうか。
- Appからpropsを渡す
- ウィンドウオブジェクトの使用
- ネストされた子コンポーネントのためのルートを作成する
私は
this.context.router
にはルートに関連する情報があると思ったのですが
this.context.router
はルートを操作するためのいくつかの関数しか持っていないようです。
どのように解決するのですか?
V6
以下のように
useNavigate
,
useLocation
そして
useMatch
を取得するために、コンポーネントに
matchPath
,
navigate
そして
location
.
const Child = () => {
const location = useLocation();
const navigate = useNavigate();
const match = useMatch("write-the-url-you-want-to-match-here");
return (
<div>{location.pathname}</div>
)
}
export default Child
V5.1 フック (要React >= 16.8)
以下のように
useHistory
,
useLocation
そして
useRouteMatch
を取得するために、コンポーネントに
match
,
history
そして
location
.
const Child = () => {
const location = useLocation();
const history = useHistory();
const match = useRouteMatch("write-the-url-you-want-to-match-here");
return (
<div>{location.pathname}</div>
)
}
export default Child
V4 & V5
以下のように
withRouter
を注入するために HOC
match
,
history
そして
location
をコンポーネントプロパティで指定します。
class Child extends React.Component {
static propTypes = {
match: PropTypes.object.isRequired,
location: PropTypes.object.isRequired,
history: PropTypes.object.isRequired
}
render() {
const { match, location, history } = this.props
return (
<div>{location.pathname}</div>
)
}
}
export default withRouter(Child)
V3
この場合
withRouter
を注入するために HOC
router
,
params
,
location
,
routes
をコンポーネントプロパティに追加してください。
class Child extends React.Component {
render() {
const { router, params, location, routes } = this.props
return (
<div>{location.pathname}</div>
)
}
}
export default withRouter(Child)
オリジナルの回答
プロップスを使用したくない場合は、以下のようにコンテキストを使用することができます。 React Routerのドキュメント
まず最初に
childContextTypes
と
getChildContext
class App extends React.Component{
getChildContext() {
return {
location: this.props.location
}
}
render() {
return <Child/>;
}
}
App.childContextTypes = {
location: React.PropTypes.object
}
すると、次のようにコンテキストを使って子コンポーネントでロケーションオブジェクトにアクセスできるようになります。
class Child extends React.Component{
render() {
return (
<div>{this.context.location.pathname}</div>
)
}
}
Child.contextTypes = {
location: React.PropTypes.object
}
関連
-
[解決済み】 Uncaught Error: Invariant Violation: 解決済み】 Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function but got: object.
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み] React JSX内のループ
-
[解決済み] Reactのこの3つの点は何をするところなのでしょうか?
-
[解決済み] React-routerのURLを更新したり、手動で書き込んだりするとうまくいかない
-
[解決済み] Reactコンポーネントに条件付きで属性を追加するにはどうすればよいですか?
-
[解決済み] React Router v4で履歴にプッシュする方法は?
-
[解決済み】React.jsで親コンポーネントにpropsを渡す。
-
[解決済み] AngularJS - ngRepeatフィルタリングされた結果の参照を取得する方法
-
[解決済み] V8 Javascript エンジンのスタンドアロン実行
最新
-
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-router - ハンドラコンポーネントにpropsを渡す
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] WebStormで未解決の変数が大量にある場合の警告に対処する方法は?
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] javascriptで文字列から関数を作成する方法はありますか?
-
[解決済み] ECMAScriptとは?
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] なぜjavascriptのES6 Promisesはresolve後も実行を継続するのですか?
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?