Búsqueda de sitios web

javascript - La ruta predeterminada de React router dom v5 no funciona


Estoy usando react router dom v5 con material ui, y tengo mis rutas de la siguiente manera:

import React from 'react'
import { BrowserRouter, Route, Switch } from 'react-router-dom'
import Layout from '../components/layout'
import Login from '../screens/Login'
import NotFound from '../screens/NotFound'
import routes from './routes'

const DynamicRoutes = () => {
  return (
    <>
      {Object.values(routes).map(({ component, path }) => (
        <Route exact path={path} key={path} component={component} />
      ))}
    </>
  )
}

const Router = () => {
  return (
    <BrowserRouter>
      <Switch>
        <Route exact path="/login" component={Login} />
        <Layout>
          <DynamicRoutes />
        </Layout>
        <Route path="*" component={NotFound} />
      </Switch>
    </BrowserRouter>
  )
}

export default Router

Ya he probado con <Route component={NotFound} />, y ninguno me funcionó. ¿Alguien puede ayudarme? El resto de las rutas funcionan correctamente, pero cuando escribo una ruta falsa, no va a la pantalla NotFound.

Respuesta #1

Eso ocurre porque todos los hijos de un <Switch> deberían ser elementos <Route> o <Redirect>. Puedes consultar más sobre esto en la documentación de react-router-dom.

Entonces, una solución para tu código sería hacer algo así:

<BrowserRouter>
      <Switch>
        <Route exact path="/login" component={Login} />
        {Object.values(routes).map(({ Component, path }) => (
          <Route exact path={path} key={path}>
            <Layout>
              <Component />
            </Layout>
          </Route>
        ))}
        <Route path="*" component={NotFound} />
      </Switch>
</BrowserRouter>

*Para tu array de objetos de rutas, la propiedad Component debe comenzar con una C mayúscula.

Puedes revisar este código de ejemplo.

Artículos relacionados