You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React使用Redirect实现私有路由不跳转,不使用useHistory如何解决?

问题原因&修复方案

1. 核心错误:导入语句写错

你当前的导入把BrowserRouter别名为Redirect,导致你实际渲染的是路由根容器组件,而非重定向组件,自然不会生效:

// 错误写法
import { BrowserRouter as Redirect, Route } from "react-router-dom";

2. 不同react-router-dom版本修复方案

如果你使用的是v5版本

直接修正导入语句即可,原有逻辑无需改动:

import React from 'react';
import { useSelector } from 'react-redux';
// 修正导入,直接引入Redirect组件
import { Redirect, Route } from "react-router-dom";

const PrivateRoute = ({component: Component, ...rest}) => {
  const {isAuthenticated,loading} = useSelector(state => state.auth);
  return (
    <Route 
      {...rest} 
      render={props => !isAuthenticated && !loading ?
        (<Redirect to='/login' />) :
        (<Component {...props} />)
      } 
    />
  )
}
export default PrivateRoute

如果你使用的是v6版本

v6版本已经移除Redirect组件和Route的render属性,需要改用Navigate组件和element属性,调整后的写法如下:

import React from 'react';
import { useSelector } from 'react-redux';
import { Navigate, Route } from "react-router-dom";

const PrivateRoute = ({component: Component, ...rest}) => {
  const {isAuthenticated,loading} = useSelector(state => state.auth);
  return (
    <Route 
      {...rest} 
      element={!isAuthenticated && !loading ?
        (<Navigate to='/login' replace />) :
        (<Component />)
      } 
    />
  )
}
export default PrivateRoute

额外注意点

  • 需确保loading状态的正确性,加载状态结束前不要执行重定向逻辑,避免未拿到认证状态就错误跳转到登录页
  • 路由注册时需把PrivateRoute包裹在BrowserRouter(v5/v6通用)的子节点范围内才会生效

内容的提问来源于stack exchange,提问作者Moody Omar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:48:04