Plusieurs Routes imbriquées dans react-router-dom v4

j'ai besoin de plusieurs routes imbriquées dans react-router-dom

j'utilise V4 de react-router-dom

j'ai mon

import { BrowserRouter as Router, Route } from 'react-router-dom';

et j'ai besoin de composants pour les rendre comme

--- Login
--- Home
    --- Page 1
    --- Page 2
    --- Page 3
--- About
--- etc

le composant Home contient un composant D'en-tête qui est commun aux composants Page1, Page2 et Page3, mais qui n'est pas présent dans Login et About.

Mon code js lit comme

<Router>
    <div>
        <Route path='/login' component={Login} />
        <Home>
            <Route path='/page1' component={Page1} />
            <Route path='/page2' component={Page2} />
            <Route path='/page3' component={Page3} />
        </Home>
        <Route path='/about' component={About} />
    </div>
</Router>

J'attends le Login composante à afficher uniquement sur / Connexion Lorsque je demande /page1, /page2, / page3, ils doivent contenir respectivement le composant Home et le contenu de cette page.

ce que j'obtiens à la place est le component de connexion rendu et au-dessous de ce component de Page1 est rendu.

je suis assez sûr que je suis en train de rater quelque chose de très insignifiant ou de faire une erreur vraiment stupide quelque part, et j'apprécierais toute l'aide que je pourrais obtenir. Je suis coincé avec ça depuis deux jours.

22
demandé sur Aditya Talpade 2017-03-23 21:50:03

5 réponses

utilisez la correspondance url/path obtenue à partir de props this.props.match.path pour obtenir le chemin qui est défini à un composant.

Définissez vos routes principales comme ci-dessous

<Router>
  <div>
    <Route exact path="/" component={DummyIndex} /> {/* Note-1 */}
    <Route path="/login" component={Login} />
    <Route path="/home" component={Home} />
    <Route path="/about" component={About} />
    <Route path="/etc" component={Etc} />
  </div>
</Router>

Puis Home Composant, de définir les itinéraires

class Home extends Component {
  render() {
    return <div>
      <Route exact path={this.props.match.path} component={HomeDefault} />
      <Route path={`${this.props.match.path}/one`} component={HomePageOne} />
      <Route path={`${this.props.match.path}/two`} component={HomePageTwo} />
    </div>
  }
}

les routes définies sont comme ci-dessous

  • / login
  • / accueil
  • /home/
  • / accueil / deux
  • /
  • / etc

Si vous voulez pour imbriquer des itinéraires plus loin dans HomePageOne/home/un/un et / home/one / b, vous pouvez procéder de la même approche.

Note-1: si vous ne voulez pas d'autres nichages, il suffit de définir la route avec prop exact.

EDIT (15 Mai 2017)

initialement, j'ai utilisé props.match.url et maintenant, je l'ai changé pour props.match.path.

nous pouvons utiliser props.match.path au lieu de props.match.url dans le chemin du chemin de sorte que si vous utilisez Path params en haut les routes de niveau, vous pouvez l'obtenir dans les routes intérieures (imbriquées) via props.match.params.

Si vous n'en avez-vous pas de chemin params, props.match.url assez

28
répondu Ram Babu S 2017-05-15 09:42:32

Cette semaine j'ai eu le même problème, je pense que le projet passe pour du temps de confusion parce que toute la documentation, les exemples et les vidéos sont pour les versions précédentes et les docs pour la version 4 sont déroutants

C'est comme ça que je fais les choses, dites-moi si cette aide

import React, { Component } from 'react';

import { BrowserRouter, Route, Switch } from 'react-router-dom';

import Root from './Root';
import Home from './Home';
import About from './About';

import './App.css';

class App extends Component {
    render() {
        return (
            <BrowserRouter>
                <div>
                    <Root>
                       <Switch>
                            <Route exact path="/" component={Home} />
                            <Route path="/home" component={Home} />
                            <Route path="/about" component={About} />
                        </Switch>
                    </Root>
                </div>
            </BrowserRouter>
        );
    }
}

export default App;
2
répondu Mirdrack 2017-04-22 16:17:50

utiliser le composant Switch dans le routeur v4

<Router>
<Switch>
  <Route path='/login' component={Login} />
  <Route path='/about' component={About} />
  <Home>
    <Route component={({ match }) =>
      <div>
        <Route path='/page1' component={Page1} />
        <Route path='/page2' component={Page2} />
        <Route path='/page3' component={Page3} />
      </div>
    }/>
  </Home>
</Switch>

export default class Home extends Component {
render() {
    return (
      <div className="Home">
          { this.props.children }
      </div>
    )
  }
}

je pense que ce code indique l'idée de base de l'utilisation de composant.

2
répondu Igor Stecyura 2018-04-10 11:17:51

déplacer toutes les routes childs vers la composante parent et prolonger la route comme ci-dessous.

<Route path={`${match.url}/keyword`} component={Topic}/>

vérifiez également réagir routeur formation

0
répondu Umair Ahmed 2017-04-05 10:38:08

Utiliser Comme suit:

class App extends Component {
  render() {
    return (
      <BrowserRouter>
        <Link to='/create'> Create </Link>
        <Link to='/ExpenseDashboard'> Expense Dashboard </Link>
        <Switch>
          <Route path='/ExpenseDashboard' component={ExpenseDashboard} />
          <Route path='/create' component={AddExpensePage} />
          <Route path='/Edit' component={EditPage} />
          <Route path='/Help' component={HelpPage} />
          <Route component={NoMatch} />
        </Switch>
      </BrowserRouter>
    );
  }
}

Voir plus @ Switch sur GitHub

0
répondu Mushfiq 2017-10-26 09:00:55