React-router-DOM 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
показывает <MainApp>
Я думаю.<Route path="*" component={PageNotFound}/>
обновление
/ - 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)
2 ответов
это один из способов сделать то, что вы описали (обратите внимание, что есть другие способы обработки макетов непосредственно в ваших компонентах React). Чтобы сохранить пример простым, другие компоненты (<Home>, <List>
etc.) создаются как чисто функциональные компоненты без свойств или состояния, но было бы тривиально поместить каждый из них в свой собственный файл в качестве надлежащего компонента 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
компонент, без верхнего или нижнего колонтитула.