جاوااسکریپت - مسیر پیشفرض React Router DOM نسخه ۵ کار نمیکند


من از react router dom نسخه ۵ با material ui استفاده میکنم و مسیرهای خود را به صورت زیر دارم:

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

من قبلاً با <Route component={NotFound} /> امتحان کردهام، و هیچکدام برای من کار نکرد. کسی میتواند کمکم کند؟ بقیه مسیرها درست کار میکنند، اما وقتی یک مسیر جعلی وارد میکنم، به صفحه NotFound نمیرود.

پاسخ شماره ۱

این اتفاق میافتد زیرا تمام فرزندان یک <Switch> باید عناصر <Route> یا <Redirect> باشند. شما میتوانید درباره آن بیشتر در مستندات react-router-dom مطالعه کنید.

بنابراین، یک راه حل برای کد شما این است که چیزی شبیه به این انجام دهید:

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

*برای آرایه شیء مسیرهای شما، ویژگی Component باید با حرف بزرگ C باشد.

شما میتوانید این کد نمونه را بررسی کنید.