Cómo configurar DefaultRoute a otra ruta en React Router


98

Tengo lo siguiente:

  <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>

Cuando se usa DefaultRoute, SearchDashboard se procesa incorrectamente ya que cualquier * Dashboard debe procesarse dentro de Dashboard.

Me gustaría que mi DefaultRoute dentro de la ruta de la "aplicación" apunte a la ruta "searchDashboard". ¿Es esto algo que puedo hacer con React Router, o debería usar Javascript normal (para una redirección de página) para esto?

Básicamente, si el usuario va a la página de inicio, quiero enviarlo al panel de búsqueda. Así que supongo que estoy buscando una función de React Router equivalente awindow.location.replace("mygreathostname.com/#/dashboards/searchDashboard");


1
¿Ha intentado utilizar Redirect en lugar de DefaultRoute? <Redirect from = "/" to = "searchDashboard" />
Jonatan Lundqvist Medén

@ JonatanLundqvistMedén eso es exactamente lo que estaba buscando, ¡gracias! Escríbalo como respuesta y lo marcaré como correcto. Lo siento por la respuesta demorada.
Matthew Herbst

Respuestas:


148

Puede utilizar Redirect en lugar de DefaultRoute

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

Actualice 2019-08-09 para evitar problemas con la actualización, use esto en su lugar, gracias a Ogglas

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

6
¿Soy solo yo, o cuando utilizo esto para acceder a una URL profunda directamente, siempre me redirigen a la URL "a", en lugar de la ruta que estoy tratando de alcanzar?
Pablote

Debe tenerse en cuenta que si está haciendo alguna redirección como from='/a' to='/a/:id', deberá usar <Switch>para incluir su componente <Redirect>y <Route>de react-router. Detalles ver documento
Kulbear

1
@Kulbear Tuve el mismo problema. Hacer lo que dijo Ogglas en su respuesta funcionó.
Alan P.

2
Para que funcione, lo más probable es que deba poner esta ruta al final o hacer esto<Redirect exact from="/" to="/adaptation" />
DarkWalker

Es fácil supervisarlo, así que repito: la parte importante de la regla de redireccionamiento de DarkWalker es la exactbandera. Falta la respuesta aceptada, por lo que coincide con [casi] cualquier ruta.
dube

55

El problema con el uso <Redirect from="/" to="searchDashboard" />es que si tiene una URL diferente, digamos, /indexDashboardy el usuario presiona actualizar o recibe una URL, el usuario será redirigido a de /searchDashboardtodos modos.

Si no desea que los usuarios puedan actualizar el sitio o enviar URL, use esto:

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

Use esto si searchDashboardestá detrás del inicio de sesión:

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

37

Intentaba incorrectamente crear una ruta predeterminada con:

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

Pero esto crea dos caminos diferentes que representan el mismo componente. Esto no solo es inútil, sino que puede causar fallas en su interfaz de usuario, es decir, cuando está diseñando <Link/>elementos basados ​​en this.history.isActive().

La forma correcta de crear una ruta predeterminada (que no sea la ruta de índice) es usar <IndexRedirect/>:

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

Esto se basa en react-router 1.0.0. Consulte https://github.com/rackt/react-router/blob/master/modules/IndexRedirect.js .


¿Cuál es el punto de tener un Routea algo que ya está manejado por usted IndexRoute?
Matthew Herbst

1
No tiene sentido, y edité mi respuesta para dejar en claro que no estaba defendiendo eso.
Set

Esto es lo que también he estado haciendo, pero me encantaría una solución que ofrezca un componente (mi página de inicio) en /lugar de tener que redirigir a, por ejemplo /home.
ericsoco

Parece que estoy buscando <IndexRoute>después de todo. Perdón por el ruido. stackoverflow.com/questions/32706913/… github.com/reactjs/react-router/blob/master/docs/guides/…
ericsoco

11

La respuesta de Jonathan no pareció funcionar para mí. Estoy usando React v0.14.0 y React Router v1.0.0-rc3. Esto hizo:

<IndexRoute component={Home}/>.

Entonces, en el caso de Matthew, creo que él querría:

<IndexRoute component={SearchDashboard}/>.

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


Gracias por compartir. Estaba usando React v0.13 y la versión de React-Router para eso, así que una versión anterior a 1.0 / rc. ¡Espero que esto ayude a otros!
Matthew Herbst

Creo que esto te hace perder el contexto. SearchDashboardserá el componente que verá cuando llegue a la página de inicio, pero no el Dashboardcomponente que lo envuelve si va directamente a /dashboard/searchDashboard. React-router construye dinámicamente una jerarquía de componentes anidados en función de las rutas que coinciden con la URL, por lo que creo que realmente necesitas una redirección aquí.
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

esto hará que cuando cargue el servidor en el host local, lo redireccionará a / algo


5

ACTUALIZACIÓN : 2020

En lugar de usar Redirect, simplemente agregue varias rutas en el path

Ejemplo:

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

3

Me encontré con un problema similar; Quería un controlador de ruta predeterminado si ninguno de los controladores de ruta coincidía.

Mi solución es usar un comodín como valor de ruta. es decir, también asegúrese de que sea la última entrada en la definición de sus rutas.

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

3

Para aquellos que llegan al 2017, esta es la nueva solución 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>

¿A qué equivale DefaultRouteen react-routerv4?
Anthony Kong

4
@AnthonyKong Creo que es: <Route exact path="/" component={Home}/>. reacttraining.com/react-router/web/example/basic
TYMG

1

El método preferido es utilizar el componente IndexRoutes del enrutador react

Lo usa así (tomado de los documentos del enrutador de reacción vinculados anteriormente):

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

0

Lo usa así para redirigir a una URL en particular y representar el componente después de redirigir del enrutador antiguo al enrutador nuevo.

<Route path="/old-router">
  <Redirect exact to="/new-router"/>
  <Route path="/new-router" component={NewRouterType}/>
</Route>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.