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

React Router Dom v6类组件登录成功后跳转welcome页问题咨询

React Router v6 类组件跳转解决方案

问题原因

你遇到的报错是因为React Hook只能在函数组件的顶层作用域调用,不能在类组件、普通函数、事件回调中使用。react-router-dom v6 移除了v4版本中类组件默认注入的history prop,也没有直接提供类组件可用的导航API。

方案1:保留类组件(无需整体重构)

自定义一个高阶组件(HOC)封装useNavigate,将导航函数注入到类组件的props中即可:

第一步:定义自定义withRouter高阶组件

import { useNavigate } from 'react-router-dom';

// 自定义HOC,为类组件注入navigate方法
const withRouter = (WrappedComponent) => {
  return (props) => {
    const navigate = useNavigate();
    return <WrappedComponent {...props} navigate={navigate} />;
  };
};

第二步:修改LoginComponent

导出组件时用上面定义的withRouter包裹,然后直接在loginClicked方法中调用this.props.navigate:

class LoginComponent extends Component {
  // 其余原有代码保持不变
  loginClicked() {
    if (this.state.username === 'testuser' && this.state.password === 'dummy') {
      // 直接调用props里注入的navigate方法跳转
      this.props.navigate('/welcome');
    } else {
      this.setState({ showSuccessMessage: false, hasLoginFailed: true });
    }
  }
}

// 用withRouter包裹后导出
export default withRouter(LoginComponent);

修改完成后即可正常实现登录跳转逻辑,无需改动其他现有代码。

方案2:重构为函数组件(官方推荐写法)

如果后续长期维护项目,更推荐重构为函数组件,直接使用Hook写法更简洁:

import { useState } from 'react';
import { useNavigate } from 'react-router-dom';

const LoginComponent = () => {
  const [formData, setFormData] = useState({
    username: 'testuser',
    password: ''
  });
  const [hasLoginFailed, setHasLoginFailed] = useState(false);
  const navigate = useNavigate();

  const handleChange = (e) => {
    setFormData(prev => ({...prev, [e.target.name]: e.target.value}));
  };

  const loginClicked = () => {
    if (formData.username === 'testuser' && formData.password === 'dummy') {
      navigate('/welcome');
    } else {
      setHasLoginFailed(true);
    }
  };

  return (
    <div>
      {hasLoginFailed && <div>Invalid Credentials</div>}
      User Name: <input type="text" name="username" value={formData.username} onChange={handleChange} />
      Password: <input type="password" name="password" value={formData.password} onChange={handleChange} />
      <button onClick={loginClicked}>Login</button>
    </div>
  );
};

export default LoginComponent;

内容的提问来源于stack exchange,提问作者jay tai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:06:02