Come impostare DefaultRoute su un'altra rotta in React Router


98

Ho il seguente:

  <Route name="app" path="/" handler={App}>
    <Route name="dashboards" path="dashboards" handler={Dashboard}>
      <Route name="exploreDashboard" path="exploreDashboard" handler={ExploreDashboard} />
      <Route name="searchDashboard" path="searchDashboard" handler={SearchDashboard} />
      <DefaultRoute handler={DashboardExplain} />
    </Route>
    <DefaultRoute handler={SearchDashboard} />
  </Route>

Quando si utilizza DefaultRoute, SearchDashboard viene visualizzato in modo errato poiché qualsiasi * Dashboard deve essere visualizzato all'interno di Dashboard.

Vorrei che il mio DefaultRoute all'interno della "app" Route puntasse al percorso "searchDashboard". È qualcosa che posso fare con React Router, o dovrei usare il normale Javascript (per un reindirizzamento di pagina) per questo?

Fondamentalmente, se l'utente va alla home page, voglio inviarlo invece alla dashboard di ricerca. Quindi immagino di cercare una funzionalità React Router equivalente awindow.location.replace("mygreathostname.com/#/dashboards/searchDashboard");


1
Hai provato a utilizzare Redirect invece di DefaultRoute? <Redirect from = "/" to = "searchDashboard" />
Jonatan Lundqvist Medén

@ JonatanLundqvistMedén è esattamente quello che stavo cercando, grazie! Scrivila come risposta e la contrassegnerò come corretta. Ci scusiamo per il ritardo nella risposta.
Matthew Herbst

Risposte:


148

Puoi usare Redirect invece di DefaultRoute

<Redirect from="/" to="searchDashboard" />

Aggiorna 2019-08-09 per evitare problemi con l'aggiornamento, usa invece questo, grazie a Ogglas

<Redirect exact from="/" to="searchDashboard" />

6
sono solo io, o quando lo uso per colpire direttamente un URL profondo, vengo sempre reindirizzato all'URL "a", invece del percorso che sto cercando di raggiungere?
Pablote

Dovrebbe essere notato che se stai facendo un reindirizzamento come from='/a' to='/a/:id', dovrai usare <Switch>per includere il tuo componente <Redirect>e <Route>da react-router. Dettagli vedi doc
Kulbear

1
@ Kulbear ho avuto lo stesso problema. Fare quello che ha detto Ogglas nella sua risposta ha funzionato.
Alan P.

2
Per farlo funzionare è molto probabile che tu debba mettere questo percorso per ultimo o farlo<Redirect exact from="/" to="/adaptation" />
DarkWalker

È facile controllarlo, quindi ripeto: la parte importante della regola Redirect di DarkWalker è la exactbandiera. La risposta di accettazione manca, quindi corrisponde a [quasi] qualsiasi percorso.
dube

55

Il problema con l'utilizzo <Redirect from="/" to="searchDashboard" />è che se hai un URL diverso, ad esempio /indexDashboarde l'utente preme Aggiorna o riceve un URL inviato a loro, l'utente verrà reindirizzato /searchDashboardcomunque.

Se non vuoi che gli utenti possano aggiornare il sito o inviare URL, usa questo:

<Route exact path="/" render={() => (
    <Redirect to="/searchDashboard"/>
)}/>

Usa questo se searchDashboardè dietro il login:

<Route exact path="/" render={() => (
  loggedIn ? (
    <Redirect to="/searchDashboard"/>
  ) : (
    <Redirect to="/login"/>
  )
)}/>

37

Stavo erroneamente cercando di creare un percorso predefinito con:

<IndexRoute component={DefaultComponent} />
<Route path="/default-path" component={DefaultComponent} />

Ma questo crea due percorsi diversi che rendono lo stesso componente. Non solo questo è inutile, ma può causare anomalie nella tua interfaccia utente, ad esempio, quando stai disegnando <Link/>elementi basati su this.history.isActive().

Il modo giusto per creare una rotta predefinita (che non è la rotta dell'indice) è usare <IndexRedirect/>:

<IndexRedirect to="/default-path" />
<Route path="/default-path" component={DefaultComponent} />

Si basa su React-Router 1.0.0. Vedi https://github.com/rackt/react-router/blob/master/modules/IndexRedirect.js .


Qual è il punto di avere Routequalcosa che è già gestito dal tuo IndexRoute?
Matthew Herbst

1
Non ha senso e ho modificato la mia risposta per chiarire che non lo stavo sostenendo.
Seth

Questo è quello che ho fatto anche io, ma mi piacerebbe una soluzione che serva un componente (la mia homepage) /invece di dover reindirizzare ad es /home.
ericsoco

Sembra che io stia cercando, <IndexRoute>dopotutto. Scusa per il rumore. stackoverflow.com/questions/32706913/... github.com/reactjs/react-router/blob/master/docs/guides/...
ericsoco

11

La risposta di Jonathan non sembrava funzionare per me. Sto usando React v0.14.0 e React Router v1.0.0-rc3. Questo ha fatto:

<IndexRoute component={Home}/>.

Quindi nel caso di Matthew, credo che vorrebbe:

<IndexRoute component={SearchDashboard}/>.

Fonte: https://github.com/rackt/react-router/blob/master/docs/guides/advanced/ComponentLifecycle.md


Grazie per la condivisione. Per questo stavo usando React v0.13 e la versione di React-Router, quindi una versione pre-1.0 / rc. Spero che questo aiuti gli altri!
Matthew Herbst

Penso che questo ti faccia perdere il contesto. SearchDashboardsarà il componente che vedrai quando arriverai alla homepage, ma non il Dashboardcomponente che lo avvolge se vai direttamente a /dashboard/searchDashboard. React-router costruisce dinamicamente una gerarchia di componenti nidificati in base alle rotte corrispondenti all'URL, quindi penso che tu abbia davvero bisogno di un reindirizzamento qui.
Stijn de Witt

6
import { Route, Redirect } from "react-router-dom";

class App extends Component {
  render() {
    return (
      <div>
        <Route path='/'>
          <Redirect to="/something" />
        </Route>
//rest of code here

questo farà in modo che quando caricherai il server sull'host locale ti reindirizzerà a / qualcosa


5

AGGIORNAMENTO : 2020

Invece di utilizzare Redirect, aggiungi semplicemente più percorsi nel file path

Esempio:

<Route exact path={["/","/defaultPath"]} component={searchDashboard} />

3

Mi sono imbattuto in un problema simile; Volevo un gestore di rotte predefinito se nessuno dei gestori di rotte corrispondeva.

La mia soluzione consiste nell'usare un carattere jolly come valore del percorso. cioè assicurati anche che sia l'ultima voce nella definizione dei percorsi.

<Route path="/" component={App} >
    <IndexRoute component={HomePage} />
    <Route path="about" component={AboutPage} />
    <Route path="home" component={HomePage} />
    <Route path="*" component={HomePage} />
</Route>

3

Per chi arriva nel 2017, questa è la nuova soluzione con IndexRedirect:

<Route path="/" component={App}>
  <IndexRedirect to="/welcome" />
  <Route path="welcome" component={Welcome} />
  <Route path="about" component={About} />
</Route>

2
 <Route name="app" path="/" handler={App}>
    <Route name="dashboards" path="dashboards" handler={Dashboard}>
      <Route name="exploreDashboard" path="exploreDashboard" handler={ExploreDashboard} />
      <Route name="searchDashboard" path="searchDashboard" handler={SearchDashboard} />
      <DefaultRoute handler={DashboardExplain} />
    </Route>
    <Redirect from="/*" to="/" />
  </Route>

Qual è l'equivalente di DefaultRoutein react-routerv4?
Anthony Kong

4
@AnthonyKong Penso che sia: <Route exact path="/" component={Home}/>. reattraining.com/react-router/web/example/basic
TYMG

1

Il metodo preferito consiste nell'usare il componente IndexRoutes del router reattivo

Lo usi in questo modo (tratto dai documenti del router react collegati sopra):

<Route path="/" component={App}>
    <IndexRedirect to="/welcome" />
    <Route path="welcome" component={Welcome} />
    <Route path="about" component={About} />
</Route>

0

Lo usi in questo modo per reindirizzare su un particolare URL e renderizzare il componente dopo il reindirizzamento dal vecchio router al nuovo router.

<Route path="/old-router">
  <Redirect exact to="/new-router"/>
  <Route path="/new-router" component={NewRouterType}/>
</Route>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.