私はWebとSOで多くの検索を行い、reactifluxチャットで質問しましたが、ルート/パスに応じて一部のコンポーネントをレンダリングするクリーンでハッキングされていない方法が見つかりませんでした。
<Header />
があり、これは一部のページに表示され、他のページには非表示になっているとしましょう。
確かに私はヘッダーコンポーネントでこの文字列を使用できます
if (props.location.pathname.indexOf('/pageWithoutAHeader') > -1) return null
/pageWithoutAHeader
が一意である場合、これはまったく問題ありません。 5ページに同じ機能が必要な場合は、次のようになります。
if (props.location.pathname.indexOf('/pageWithoutAHeader1') > -1) return null
if (props.location.pathname.indexOf('/pageWithoutAHeader2') > -1) return null
if (props.location.pathname.indexOf('/pageWithoutAHeader3') > -1) return null
はい、配列にルートを格納してループを作成できます。これにより、コードの再利用性が向上します。しかし、これはこのユースケースを処理するための最良かつ最もエレガントな方法ですか?
たとえば、ルート/xyz
のページのヘッダーをレンダリングせず、/projects/:id
やid=xyzfoo
などのUUIDのルートがある場合は、バグが発生する可能性もあると思います。したがって、/projects/xyzfoo
はヘッダーを表示しませんが、表示する必要があります。
最初にヘッダーのないすべてのルートを一覧表示し、他のルートを追加のスイッチにグループ化できます。
...
<Switch>
<Route path="/noheader1" ... />
<Route path="/noheader2" ... />
<Route path="/noheader3" ... />
<Route component={HeaderRoutes} />
</Switch>
...
HeaderRoutes = props => (
<React.Fragment>
<Header/>
<Switch>
<Route path="/withheader1" ... />
<Route path="/withheader2" ... />
<Route path="/withheader3" ... />
</Switch>
</React.Fragment>
)
ドキュメント から:
パスのないルートは常に一致します。
残念ながら、このソリューションでは「見つからない」ページに問題がある可能性があります。 HeaderRoutes
の最後に配置する必要があり、Header
でレンダリングされます。
ダラの解決策 そのような問題はありません。ただし、Reactルーターの内部が変更された場合、Switch
ではうまく機能しない可能性があります。
<Switch>
のすべての子は、<Route>
または<Redirect>
要素である必要があります。現在の場所に一致する最初の子のみがレンダリングされます。
Route
上のHOCはRoute
自体ではありません。しかし、現在のコードベースは実際にはReact.Element
および<Route>
と同じ小道具セマンティクスを持つ<Redirect>
を想定しているため、正常に機能するはずです。
ヘッダーに関するこのデータをルートパラメータまたはクエリとして含めます。
/ projects /:headerBool /:id
または:
/ projects /:id?header = false
次に、props.matchまたはprops.locationを介してアクセスできます。
ルートのrender属性を使用できます。例:
<Route path='/pageWithoutHeader' render={() => <Page1 />} />
<Route path='pageWithHeader' render={() =>
<Header/>
<Page2 />}
/>
この方法は、ページ内のヘッダーコンポーネントを使用するよりも優れています。