【发布时间】:2020-07-20 10:40:39
【问题描述】:
我按照官方文档right here 为react-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