[英]React Router: How to render element on all routes, except one?
我有這樣的 HTML 結構:
<body>
<nav>
<!--navigation elements -->
</nav>
<div className='main'>
<!--other elements -->
</div>
<div className='container'></div>
</body>
路由定義如下:
<Router>
<Fragment>
<Navbar />
<Route exact path="/" component={Landing} />
<div className="container">
<Alert />
<Switch>
<Route exact path="/register" component={Register} />
<Route exact path="/login" component={Login} />
<Route exact path="/profiles" component={Profiles} />
</Switch>
</div>
</Fragment>
</Router>
“容器”元素存在於所有路由上,但我不希望它在“/”路由上呈現。
如何阻止<div className="container">
在"/"
路由上呈現? 我希望它在除"/"
之外的所有其他路線上呈現。
我發現但不想使用的解決方案是在我的<Switch>
呈現的每個組件中顯式插入帶有class="container"
的元素。 有沒有更好的辦法?
這個想法是通過嵌套路由將結構引入路由,以限制<div className="container">
渲染為非/
路由。
為此,您可以提取一個為路徑呈現<Route>
的組件(即WithContainer
); /register
、 /login
和/profiles
,位於<div className="container">
。 然后,您將更改<Switch>
以現在為以下路線情況呈現兩條路線;
<Route/>
將Landing
組件呈現在/
的完全匹配上<Route/>
,它在沒有特定路線(即不完全匹配/
任何路徑)上呈現您的新WithContainer
組件通過以這種方式使用<Switch>
,它會導致路由行為根據第一個匹配的路由呈現Landing
或WithContainer
(但不是兩者)。 我們利用這種行為來限制“非/
”路由的WithContainer
(以及<div className="container">
元素)的呈現。
在代碼中,這種方法可以表示為:
const WithContainer = () => (
<div className="container">
{ /* Wrap routes in container div */ }
<Route exact path="/register" component={Register} />
<Route exact path="/login" component={Login} />
<Route exact path="/profiles" component={Profiles} />
</div>)
const Main = () => (
<main>
<Switch>
<Route exact path='/' component={Landing}/>
<Route component={ WithContainer } /> {/* No match route */ }
</Switch>
</main>
)
希望有幫助!
使用最新版本的 React Router,您可以為path
屬性提供一個字符串數組,以便特定路由在多個匹配項上呈現:
<Route path={['/one', '/two', '/three']} component={SomeComponent} />
這是相關文檔的鏈接: https : //reacttraining.com/react-router/web/api/Route/path-string-string 。
如果你不想創建一個單獨的組件,你可以這樣做。 如果您想保留原始功能,您還需要保留內部開關。
// parent switch
<Switch>
<Route exact path="/" component={Landing} />
// start route wrap!!!
<Route>
<div className="container">
<Switch>
<Route exact path="/register" component={Register} />
<Route exact path="/login" component={Login} />
<Route exact path="/profiles" component={Profiles} />
</Switch>
</div>
</Route>
// end route wrap!!!
</Switch>
您應該將 Routes 視為任何其他 UI 組件。 您可以任意嵌套它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.