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");

Matthew Herbst
fuente
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" />
Jonatan Lundqvist Medén
fuente
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"/>
  )
)}/>
Ogglas
fuente
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 .

Seth
fuente
¿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

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


fuente
5

ACTUALIZACIÓN : 2020

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

Ejemplo:

<Route exact path={["/","/defaultPath"]} component={searchDashboard} />
Thanveer Shah
fuente
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>
devil_io
fuente
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>
Kevin Hernandez
fuente
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>
user3889017
fuente
¿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>
Marc Costello
fuente
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>
surbhi241
fuente