Comment emboîter les routes dans le routeur React v4?

y a-t-il un moyen de nicher des routes dans le routeur React v4?

Cela fonctionne:

  <Router basename='/app'>
    <main>
      <Route path='/' component={AppBar} />
      <Route path='/customers' component={Customers} />
    </main>
  </Router>

Ce n'est pas:

  <Router basename='/app'>
    <Route path='/' component={AppBar}>
      <Route path='/customers' component={Customers} />
    </Route>
  </Router>

Composant Client:

import React, { Component, PropTypes } from 'react'
import styled from 'styled-components'

export default class Customers extends Component {
  render () {
    return (
      <Container>
        <h1>Customers</h1>
      </Container>
    )
  }
}

const Container = styled.section`
  height: 100%;
  padding: 15px;
  overflow: auto;
`
15
demandé sur Raphael Rafatpanah 2017-02-15 19:29:43

5 réponses

Meilleur modèle que j'ai trouvé jusqu'à présent.

// main app
<div>
    // not setting a path prop, makes this always render
    <Route component={AppShell}/>
    <Switch>
        <Route exact path="/" component={Login}/>
        <Route path="/dashboard" component={AsyncDashboard(userAgent)}/>
        <Route component={NoMatch}/>
    </Switch>
</div>

je peux juste garder emboîter ceci dans un composant et tout fonctionne bien y compris hmr (si vous utilisez webpack, n'oubliez pas de mettre output.publicPath à "/" )

// dashboard component
<div>
    // the same way as before, not setting a path prop
    // makes it render on every /dashboard/** request 
    <Route component={DashboardTAB}/>
    <Switch>
        // longer path (with same root) than others first
        <Route path="/dashboard/graphs/longerpath" component={GraphForm}/>
        <Route path="/dashboard/graphs" component={Graphs}/>
        <Route path="/dashboard/workers" component={List}/>
        <Route path="/dashboard/insert" component={InsertComponent}/>
    </Switch>
</div>
26
répondu CESCO 2017-04-24 23:35:21

Je l'ai adapté des docs, semblent fonctionner jusqu'à présent. Il manque probablement quelque chose d'évident, et oui ce n'est pas le chemin v4 mais nous avons besoin de toutes les routes définies en un seul endroit.

function RouteNest(props){ return (
  <Route exact={props.exact} path={props.path} render={ p => <props.component {...p} children={props.children}/> } />
)}

export const MainRoutes = props => 

<div className='content layout'>

  <Route exact path="/" component={Landing}/>
  <Route  path={'/contact'} component={Contact}/>

  <RouteNest  path={'/thing'} component={CompoWithSub}>
    <RouteNest  path={'/thing/suba'} component={SubComponentA}/>
    <RouteNest  path={'/thing/subb'} component={SubComponentB}/>
  </RouteNest>


</div>

export const CompoWithSub = props => <div>{props.children)</div>
6
répondu soundyogi 2017-03-29 05:47:22

Vous êtes d'applications alot composant est chargé de rendre les Clients. Pour que les clients soient appelés, vous devez rendre les enfants D'AppBar. Tout ce qui est directement imbriqué sous AppBar est un enfant D'AppBar.

import React from 'react';

const AppBar = ({ children }) => (
  <div>
    <header>
       <h1> stuff </h1>
    </header>
    {children}
  </div>
);

export default AppBar

Veuillez noter que seules les applications alot sera rendu lorsque vous visitez "/". AppBar et les clients rendront lorsque vous visitez "/ clients".

1
répondu ExperimentsWithCode 2017-02-15 16:49:41

si quelqu'un veut avoir des routes imbriquées sans taper le préfixe de route wrapper, j'ai créé quelque chose comme ça dans TSX:

Importations:

import * as React from 'react';
import { Route, RouteComponentProps, RouteProps, Switch } from 'react-router-dom';
import Index from 'views/index';
import Login from 'views/login';
import NoMatch from 'views/no-match';

Interfaces:

interface INestedRoutes {
    nested?: string;
}

interface INestedRoute extends RouteProps, INestedRoutes {}

NestedRoute et nestedroutes wrapper:

class NestedRoutes extends React.Component<INestedRoutes> {
    public render() {
        const childrenWithProps = React.Children.map(this.props.children, (child) => {
            return React.cloneElement(
                child as React.ReactElement<any>, { nested: this.props.nested },
            );
        })
        return childrenWithProps;
    }
}


const NestedRoute: React.SFC<INestedRoute> = (props: INestedRoute) => {
    return <Route path={`${props.nested}${props.path}`} component={props.component} />;
};

et routes avec wrapper:

const MultiLanguage: React.SFC<RouteComponentProps<any>> = (props: RouteComponentProps<any>) => {
    return (
        <NestedRoutes nested={props.match.path} >
            <NestedRoute path="/test" component={Login} />
            <NestedRoute path="/no-match" component={NoMatch} />
        </NestedRoutes>
    );
};


export default (
    <Switch>
        <Route path="/:language" component={MultiLanguage}/>
        <Route exact={true} path="/" component={Index} />
        <Route path="/login" component={Login} />
        <Route component={NoMatch} />
    </Switch>
);
1
répondu Marcin Sadowski 2017-12-19 16:40:29

pour les routes emboîtées il y a un moyen très simple que j'utilise.

exemple routeur principal est be comme cela

<Router history={history}>
  <Switch >
    <Route path="/" component={Home}></Route>
  </Switch>
</Router>

à l'Intérieur de la Maison à l'aide de gamme Imbriquée:

<div className="App">
  <Navbar title="Home" links = { NavbarLinks }/>
  {this.renderContentPage()}
</div>

renderContentPage vérifiera L'URL et affichera la route imbriquée.

<Route exact path="/" component={Page1}></Route>
<Route exact path="/page1" component={Page1}></Route>
<Route exact path='/page2' component={Page2} />

donc inside Home component page1 et page2 components rendus.

0
répondu Hadnazzar 2018-08-06 08:01:25