【问题标题】:404 page in REACTREACT 中的 404 页面
【发布时间】:2018-08-17 07:29:26
【问题描述】:

我创建了组件NotFound,当我转到一个不存在的页面时它工作正常。但它出现在我所有页面中的同一页面,不仅仅是不存在的页面。这是组件:

import React from 'react'

const NotFound = () =>
  <div>
    <h3>404 page not found</h3>
    <p>We are sorry but the page you are looking for does not exist.</p>
  </div>

export default NotFound

这就是我在主页中使用它的方式:

class MainSite extends Component {
  render () {
    return (
      <div>
        {/* Render nav */}
        <Route path='/dashboard' component={Nav} />
        <Route path='/retrospectives' component={Nav} />
        <Route path='/users' component={Nav} />
        <Route path='/projects' component={Nav} />

        {/* Dashboard page */}
        <ProtectedRoute exact path='/dashboard' component={DashboardPage} />

        {/* Retrospectives page */}
        <ProtectedRoute exact path='/retrospectives' component={RetrospectivesPage} />

        {/* Users page */}
        <ProtectedRoute exact path='/users' component={UsersPage} />

        {/* Projects page */}
        <ProtectedRoute exact path='/projects' component={ProjectsPage} />

        {/* Retrospective related pages */}
        <Route exact path='/retrospectives/:retrospectiveId' component={Retrospective} />
        <Route exact path='/join-retrospective' component={JoinRetrospective} />
        <ProtectedRoute exact path='/create-retrospective/:retrospectiveId' component={Retrospective} />

        {/* OnBoarding pages */}
        <ProtectedRoute exact path='/beta-code' component={BetaCodeAccess} />
        <Route exact path='/auth-handler' component={AuthHandler} />
        <Route exact path='/join-organization' component={JoinOrganization} />
      </div>
    )
  }
}

export default MainSite

如您所见,我使用&lt;Route path="*" component={NotFound} /&gt; 创建 404 页面,但该组件也出现在每个现有页面中。我该如何解决这个问题?

【问题讨论】:

  • 使用 Switch 标签来包装你的路由。这样只有一条路线被渲染。另外,将您未找到的路线放在路线的最底部并删除路径属性。

标签: javascript reactjs http-status-code-404


【解决方案1】:

试试这个:

  import { Switch, Route } from 'react-router-dom';

  <Switch>
    <Route path='/dashboard' component={Nav} />
    <Route path='/retrospectives' component={Nav} />
    <Route path='/users' component={Nav} />
    <Route path='/projects' component={Nav} />

    <Route path="" component={NotFound} />
  </Switch>

【讨论】:

    【解决方案2】:

    以下所有示例都可以正常工作:

    <Route path="" component={NotFound} /> // empty ""
    <Route path="*" component={NotFound} /> // star *
    <Route component={NotFound} /> // without path
    

    或者如果你想返回一个不带任何组件的简单 404 消息:

    <Route component={() => (<div>404 Not found </div>)} />
    

    【讨论】:

      【解决方案3】:

      试试这个:

      import React from "react";
      import { Redirect, Route, Switch, BrowserRouter } from 'react-router-dom';
      import HomePage from './pages/HomePage.jsx';
      import NotFoundPage from './NotFoundPage.jsx';
      class App extends React.Component {
          render(){
              return(
                  <BrowserRouter>
                      <Switch>
                          <Route exact path='/' component={HomePage} />
                          <Route path="*" component={NotFoundPage} />
                      </Switch>
                  </BrowserRouter>
              )
          }
      }
         
      export default App;
      <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

      【讨论】:

        【解决方案4】:

        只需从 react-router-dom 导入 Switch 并将所有路由包装在 Switch 组件中。同样重要的是要注意将 404Page 组件保持在最底部(就在您的 switch 结束标记之前),这样它将首先将每个组件与其路由匹配。如果匹配,它将渲染组件,否则检查下一个。最终如果没有匹配的路由建立,就会渲染404Page

        【讨论】:

          【解决方案5】:

          对于那些使用react-router-dom v6 寻找答案的人来说,很多事情都发生了变化。例如,Switch 已不存在,您必须使用 element 而不是 component,...查看这个小示例以获得一个想法:

          import React from 'react'
          import ReactDOM from 'react-dom'
          import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'
          
          import './index.css'
          import App from './App'
          
          const Test = () => (
            <h1>404</h1>
          )
          
          ReactDOM.render(
            <React.StrictMode>
              <Router>
                <Routes>
                  <Route path='/' element={<App />} />
                  <Route path='*' element={<Test />}/>
                </Routes>
              </Router>
            </React.StrictMode>,
            document.getElementById('root')
          )
          

          这样您就可以定义您的home 路线,所有订单路线都将显示 404。查看official guide 了解更多信息。

          【讨论】:

            猜你喜欢
            • 2019-07-04
            • 2020-02-13
            • 1970-01-01
            • 2018-07-11
            • 2021-06-13
            • 1970-01-01
            • 2021-12-02
            • 1970-01-01
            • 2011-04-06
            相关资源
            最近更新 更多