Javascript 仅反应路由器路由从配置渲染第一个路由
我根据官方文档为react router dom创建了一个路由配置 但是当我试图实现我的代码时,它只呈现配置中的第一条路由 routes.jsJavascript 仅反应路由器路由从配置渲染第一个路由,javascript,reactjs,react-router-dom,Javascript,Reactjs,React Router Dom,我根据官方文档为react router dom创建了一个路由配置 但是当我试图实现我的代码时,它只呈现配置中的第一条路由 routes.js import TellerLoginPage from '../TellerLoginPage'; import TellerMenuPage from '../TellerMenuPage'; export const routeConfig = [ { path: '/teller/login', exact: true,
import TellerLoginPage from '../TellerLoginPage';
import TellerMenuPage from '../TellerMenuPage';
export const routeConfig = [
{
path: '/teller/login',
exact: true,
component: TellerLoginPage,
},
{
path: '/teller',
exact: true,
component: TellerMenuPage,
},
];
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;
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>
)
}
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>
)
}
我创建了一个组件,将实现道具的逻辑从react router dom
封装到Route
组件中
RouteItem.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,
},
];
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;
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>
)
}
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>
)
}
有什么我错过了的吗?哈哈,我现在觉得自己像@patrick evans一样愚蠢
…您直接在开关中渲染自己的组件RouteItem
,而不是直接在Route
中渲染<代码>开关
可能在内部尝试使用类似于子级
道具的东西来访问每个路由
同时,他们使用扩展语法(
)代替passroute
,作为route
prop:)
。因此,Switch
可以访问示例中的路由道具,但不能访问代码中的路由道具
你只要把
)
修改成)
就行了。当然,将您自己的组件更改为constrouteItem=(route)=>{…
您是否检查了您的jsx,如果它生成正确的jsx语法?您说“它只呈现我的第一条路由”是什么意思?您使用的路径是什么?有两条不同的路径带有exact
标志,因此在本例中只有一条路径是正确的rendered@Mateen我确实检查了它,它在CLI上没有产生错误。而且由于直接渲染可以工作,我相信我的jsx输出是正确的。这可能是因为您正在渲染自己的组件RouteItem
dir直接在开关中,而不是直接在路由中。开关可能在内部尝试使用子级属性来访问每个路由,但看到的是您的组件,因此无法正确设置路由。此行错误==>exact={Route.exact}兄弟,你是个英雄。但是使用spread和直接给它一些道具,比如route={r}有什么区别呢
不同之处在于Switch
可以访问子道具来定义它应该呈现的路由。在您的情况下,它应该像这样访问child.props.route.path
,但是由于Switch
假设子道具类似于route
组件,它只执行类似child.props.pa的操作哦,我明白了,我所做的是我忽略了孩子们需要的道具。非常感谢你,伙计!