React-router-dom v4 嵌套路由不起作用

Posted

技术标签:

【中文标题】React-router-dom v4 嵌套路由不起作用【英文标题】:React-router-dom v4 nested routes not working 【发布时间】:2017-09-04 16:52:09 【问题描述】:

关于未解决的问题(作为最终结论)

Multiple Nested Routes in react-router-dom v4 How to nest routes in React Router v4?

我也遇到了同样的问题。

https://reacttraining.com/react-router/web/guides/quick-start提升react-router-dom

此外,人们发现list down routes 在一个文件中而不是在组件中更好。

提到的东西: https://github.com/ReactTraining/react-router/tree/master/packages/react-router-config

一些工作(大部分):

import * as React from 'react'
import BrowserRouter as Router, Route, Switch  from 'react-router-dom'


export const Routes = () => (
  <Router>
    <div>
      <Switch>
        <Route exact path="/login" component=Login/>
        <MainApp path="/">
          <Route path="/list" component=List/>
          <Route path="/settings" component=Settings/>
        </MainApp>
        <Route path="*" component=PageNotFound/>
      </Switch>
    </div>
  </Router>
)

有些东西不工作: site.com/SomeGarbagePath 表示我认为的 &lt;MainApp&gt;&lt;Route path="*" component=PageNotFound/&gt;

更新

/ - Home - parent of all (almost)
/List - inside home
/Settings - inside home
/Login - standalone
/Users - inside home, For now just showing itself. It has further pages.
/User/123 - inside user with /:id
/User/staticUser - inside user with static route
/garbage - not a route defined (not working as expected)

【问题讨论】:

不清楚你在问什么。请举例说明您的路线应该是什么,以及您希望路线的行为方式。 @ToddChaffee 登录页面是独立的。 / 想要在页眉和页脚之间呈现页眉、页脚和其他一些内容。内容基于路由器路径(例如,list 用于/listsettings 组件用于/settings。如果没有路由匹配,则为pageNotFound @Masood - 你找到解决方案了吗?出于某种原因,下面的答案对我不起作用。 【参考方案1】:

这是执行您所描述的一种方式(请注意,还有其他方式可以直接在您的 React 组件中处理布局)。为了使示例简单,其他组件(&lt;Home&gt;, &lt;List&gt; 等)被创建为没有属性或状态的纯功能组件,但是将每个组件作为适当的 React 组件放在自己的文件中是微不足道的。下面的示例已完成并将运行。

import React,  Component  from 'react';
import  BrowserRouter as Router, Route, Switch  from 'react-router-dom';

class App extends Component 
  render() 

    const Header = () => <h1>My header</h1>;
    const Footer = () => <h2>My footer</h2>;
    const Login = () => <p>Login Component</p>;    
    const Home = () => <p>Home Page</p>;
    const List = () => <p>List Page</p>;
    const Settings = () => <p>Settings Page</p>;
    const PageNotFound = () => <h1>Uh oh, not found!</h1>;

    const RouteWithLayout = ( component, ...rest ) => 
      return (
        <div>
          <Header />
          <Route ...rest render= () => React.createElement(component)  />
          <Footer />
        </div>
      );
    ;

    return (
      <Router>
        <div>
          <Switch>
            <Route exact path="/login" component=Login />
            <RouteWithLayout exact path="/" component=Home />
            <RouteWithLayout path="/list" component=List />
            <RouteWithLayout path="/settings" component=Settings />
            <Route path="*" component=PageNotFound />
          </Switch>
        </div>
      </Router>    
    );
  


export default App;

这将执行以下操作,希望这就是您的问题中现在描述的内容:

    /login 没有页眉或页脚。 //list/settings 都有页眉和页脚。 任何未找到的路由都将显示PageNotFound 组件,没有页眉或页脚。

【讨论】:

Chafee,A) 我不希望 /login 拥有 Header。请让我知道什么适合我的用例。 B)我可能会或很多不会为少数组件而不是其他组件嵌套路由(如示例所示) 您的示例中没有嵌套路由,或者至少不清楚。您“嵌套”路由的方式是/login,然后是/login/list/login/settings。你真正想要的是什么?你的问题太不清楚了。如果您需要帮助,您需要在问题中提供更多示例。告诉我们为什么要嵌套路由。你想达到什么行为。如果你能告诉我们,也许我们可以提供帮助。 Todd Chaffee 我从来没有说过 /login/list。如果你观察到 A)react-router-dom v4,路由有组件。 B) 见&lt;MainApp&gt; 没有/login 路由。所以路线不是login/list,而是/list。这不是v3。更多细节:见update Todd Chaffee,您的解决方案很有前途并且有效!但是我想要一些在单个文件上具有路由、嵌套并且仍然使用 react-router-dom-v4 方式的路由。到目前为止,我接受你的解决方案是最好的。非常感谢您的努力!【参考方案2】:

说实话,我不完全确定你在问什么。我假设你正试图让你的“某些东西不起作用”的例子起作用。

类似的,

import * as React from 'react'
import BrowserRouter as Router, Route, Switch  from 'react-router-dom'


export const Routes = () => (
  <Router>
    <div>
      <Switch>
        <Route exact path="/login" component=Login/>
        <MainApp path="/">
          <Switch>
            <Route path="/list" component=List/>
            <Route path="/settings" component=Settings/>
          </Switch>
        </MainApp>
        <Route component=PageNotFound /> 
      </Switch>
    </div>
  </Router>
)

【讨论】:

感谢您的回复,但它不起作用。它在 MainApp 页面内显示错误页面(或根本不显示 放置变化);当 garbabe 键入链接时。

以上是关于React-router-dom v4 嵌套路由不起作用的主要内容,如果未能解决你的问题,请参考以下文章

React-router-dom:嵌套路由不起作用,而是从根组件应用程序中路由

React开发中使用react-router-dom路由最新版本V5.1.2路由嵌套子路由

React开发中使用react-router-dom路由最新版本V5.1.2路由嵌套子路由

如何在react-router-dom中嵌套路由[重复]

ReactSPA - 路由机制 - react-router-dom - 基本路由 - 嵌套路由 - 传递参数 - 路由跳转

在 React-Router-Dom 中声明嵌套路由的方式