簡體   English   中英

React Router:如何在所有路由上渲染元素,除了一個?

[英]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>以現在為以下路線情況呈現兩條路線;

  1. <Route/>Landing組件呈現在/的完全匹配上
  2. 一個<Route/> ,它在沒有特定路線(即不完全匹配/任何路徑)上呈現您的新WithContainer組件

通過以這種方式使用<Switch> ,它會導致路由行為根據第一個匹配的路由呈現LandingWithContainer (但不是兩者)。 我們利用這種行為來限制“非/ ”路由的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM