React-router-dom 受保护的路由不起作用

Posted

技术标签:

【中文标题】React-router-dom 受保护的路由不起作用【英文标题】:React-router-dom Protected Routes are not working 【发布时间】:2021-12-20 00:47:30 【问题描述】:

受保护的 Routes.js:

在受保护的路由中,您可以看到我在 if 语句中直接使用 false,但我仍然能够看到该页面,为什么?

import React from 'react';
import  Route  from 'react-router-dom';
// import Auth from './User/Auth';
import Error401 from './Error/401';


// create a component for protected route


console.log('Routes.js');


export const ProtectedRoute = ( element: Element, ...rest ) => 
    console.log("Function Called")
    return (
        <Route ...rest render=props => 
                if(false) 
                    return <Element ...props />
                else
                    return <Error401 />
                
            
         />
    )

App.js: 这是 app.js,我在其中使用受保护的路由组件

import './App.css';
import React from 'react';
import  BrowserRouter, Route, Routes  from 'react-router-dom';
import  Layout  from 'antd';
import  MoneyCollectOutlined  from '@ant-design/icons';
import Login from './Components/User/Login'; 
import Signup from './Components/User/Signup';
import ProtectedRoute from './Components/Routes';
import Error404 from './Components/Error/404';

function App() 
  return (
    <BrowserRouter>
      <Layout style=minHeight:"100vh">
        <Layout.Header>
          <h1 style=color:"white" align="center"> <MoneyCollectOutlined/>MoneyG</h1>
        </Layout.Header>
        
        <Layout.Content style=minHeight:"100%">
          <Routes>
            <ProtectedRoute exact path="/register" element=<Signup/> />
            <ProtectedRoute exact path="/login" element=<Login/> />
            <Route path="*" element=<Error404/> />
          </Routes>
        </Layout.Content>
        
      </Layout>
    
    </BrowserRouter>
  );


export default App;

【问题讨论】:

如果你的条件是false,你的if语句的else块将被执行,而不是if块。它需要if(true) 才能显示您的页面而不是错误页面 是的,但我在 else 块中使用了 error401,那么为什么它没有显示 error401。 element=&lt;Signup/&gt; 应该是 element=Signup(与 Login + Error404 相同),如果您可以创建一个代码框并在您的帖子中分享它,那么重现和调试您的问题可能会更容易。跨度> 我无法创建我的代码的代码框,因为编译时出现了一些错误,但我注意到我的代码中的另一件事是在受保护的 Routes.js 中 console.log('Routes.js'); 工作正常,但 console.log('Function Called'); 这个一个不能在控制台上工作 【参考方案1】:

首先,&lt;Routes&gt; 元素应该只有 &lt;Route&gt; 元素作为子元素。您应该将保护逻辑下移一层。

其次,render 属性在 V6 中不再存在。它被替换为element。见doc。

以下是您可以解决的方法:

<Routes>
  <Route exact path="/register" element=(
    <ProtectedRoute>
      <Signup/>
    </ProtectedRoute>
  ) />
  <Route exact path="/login" element=(
    <ProtectedRoute>
      <Login/>
    </ProtectedRoute>
  ) />
  <Route path="*" element=<Error404/> />
</Routes>

还有:

const ProtectedRoute = () => 
  if (condition)  return <Error401 />;  // You might as well use Navigate here

  return children;
;

【讨论】:

以上是关于React-router-dom 受保护的路由不起作用的主要内容,如果未能解决你的问题,请参考以下文章

页面未呈现;在 react-router-dom 中使用受保护的路由将道具传递给孩子时

反应路由器 - 受保护的路由组件不起作用

为啥 react-router-dom 自定义路由不起作用?

React-router-dom:非常简单的嵌套路由不起作用

React-router-dom:嵌套路由不起作用,而是从根组件应用程序中路由

如何在 react-router-dom 中实现像 vue-router 这样的路由器离开保护?