【问题标题】:React Router Route only render first route from configReact Router Route 仅从配置中渲染第一条路由
【发布时间】:2020-07-20 10:40:39
【问题描述】:

我按照官方文档right herereact-router-dom 创建了一个路由配置

但是当我尝试实现我的代码时,它只从配置中呈现我的第一条路线。

routes.js

import TellerLoginPage from '../TellerLoginPage';
import TellerMenuPage from '../TellerMenuPage';

export const routeConfig = [
  {
    path: '/teller/login',
    exact: true,
    component: TellerLoginPage,
  },
  {
    path: '/teller',
    exact: true,
    component: TellerMenuPage,
  },
];

我创建了一个组件,将实现 props 的逻辑从react-router-dom 包装到Route 组件中。

RouteItem.js

import React from 'react';
import { Route } from 'react-router-dom';

const RouteItem = ({ route }) => {
  console.log(route);
  return (
    <Route
      path={route.path}
      exact={route.exact}
      render={(props) => <route.component {...props} />}
    />
  );
};

export default RouteItem;

App.js

import React from 'react';
import { BrowserRouter as Router, Switch, Route, Redirect } from 'react-router-dom';
import RouteItem from '../../components/RouteItem';

import { routeConfig } from './routes';

function App() {
   const populateRoute = () => {
     const jsx = [];

     routeConfig.forEach((r, i) => {
       jsx.push(<RouteItem route={r} key={i} />);
     });

     return jsx;
   };

   return (
     <Router>
     // ...
       <Switch>
         {populateRoute()}
        </Switch>
      // ...
     </Router>
   )
}

发生的情况是,唯一正确渲染的路由是 routes.js 数组中第一个提到的路由。 但是当我尝试直接在App.js中渲染它时,路由被正确渲染了。

直接渲染 - App.js

import React from 'react';
import { BrowserRouter as Router, Switch, Route, Redirect } from 'react-router-dom';
import RouteItem from '../../components/RouteItem';

import { routeConfig } from './routes';

function App() {
   return (
     <Router>
     // ...
       <Switch>
         {routeConfig.map((r, i) => {
            return <Route path={r.path} render={(props) => <r.component {...props} key={i} />} />;
         })}
        </Switch>
      // ...
     </Router>
   )
}

有什么我错过的吗哈哈,我现在觉得很愚蠢

【问题讨论】:

  • 你检查过你的 jsx,如果它产生了正确的 jsx 语法?
  • “它只渲染我的第一条路线”是什么意思?你用什么路径?有两条带有exact 标志的不同路线,因此在本例中只有一条会被渲染
  • @Mateen 我确实检查了它,它在 CLI 上没有产生错误。而且由于直接渲染有效,我相信我的 jsx 输出是正确的。
  • 这可能是因为您将自己的组件RouteItem 直接呈现在Switch 中,而不是直接在Route 中。 Switch 可能在内部尝试使用类似 children 的道具来访问每个路由,但看到的是您的组件,因此无法正确设置路由。
  • 这一行是错误的 ==> 精确={route.exact}

标签: javascript reactjs react-router-dom


【解决方案1】:

作为@patrick-evans mentioned in the comment

...您正在直接在Switch 中渲染您自己的组件RouteItem,而不是直接在Route 中。 Switch 可能在内部尝试使用类似 children 的道具来访问每条路由...

official example,他们使用扩展语法(&lt;RouteWithSubRoutes key={i} {...route} /&gt;)而不是将route 传递为route 属性:&lt;RouteItem route={r} key={i} /&gt;)。因此Switch 可以在示例中访问路由道具,但不能在您的代码中。

您应该将&lt;RouteItem route={r} key={i} /&gt;) 修复为&lt;RouteItem {...r} key={i} /&gt;),它应该可以工作。当然也可以把你自己的组件改成const RouteItem = (route) =&gt; {...

【讨论】:

  • 兄弟,你是英雄。但是使用传播和直接给它像route={r}这样的道具有什么区别
  • 不同之处在于Switch 可以访问children props 来定义它应该渲染哪些路由。在您的情况下,它应该像这样访问child.props.route.path,但由于Switch 假设孩子们会像Route 组件它只做类似child.props.pathprove)的事情
  • 哦,我明白了,我所做的是我省略了孩子们需要的道具。非常感谢你!
猜你喜欢
  • 2019-03-13
  • 2018-01-06
  • 2021-03-10
  • 1970-01-01
  • 2018-10-18
  • 2017-06-07
  • 2017-11-15
相关资源
最近更新 更多