this.props.history.push("/") 没有将我重定向到主页

2024-04-25

我正在尝试将此登录页面重定向到主页,但出于某种原因this.props.history.push('/')没有重定向它。我有一个handleSubmit它应该在我按下登录按钮后运行。我不太确定发生了什么事。按登录按钮运行handleSubmit但是,它正好在this.props.history.push('/')。任何帮助表示赞赏。

App.js

class App extends Component {
  render() {
    return (
      <MuiThemeProvider theme={theme}>
        <Provider store={store}>
          <Router>
            {/* <Navbar /> */}
              <div className="container">
                <Routes>
                  <Route exact path="/" element={<Home/>} />
                  <Route exact path="/loginUser" element={<Login/>} />
                  <Route exact path="/createUser" element={<Signup/>} />
                </Routes>
              </div>
          </Router>
        </Provider>
      </MuiThemeProvider>
    );
  }
}

export default App;

Login.js

class Login extends Component {
    constructor(){
        super();
        this.state = {
            email: '',
            password: '',
            errors: {}
        }
    }

    handleSubmit = (event) => {
        event.preventDefault();
        const userData = {
            email: this.state.email,
            password: this.state.password
        }
        
        axios
        .post("/loginUser", userData)
        .then(res => {
            console.log(res.data);
            localStorage.setItem('FBIdToken', `Bearer ${res.data.token}`);
            this.props.history.push('/')
        })
        .catch((err) => {
            console.log("ERROR inside loginUser.js");
        })
    }
    // Combine handleEmailChange and handlePasswordChange
    handleEmailChange = (event) => {
        this.setState({
            email: event.target.value
        })
    }
    handlePasswordChange = (event) => {
        this.setState({
            password: event.target.value
        })
    }

    render() {
        const { classes } = this.props;
        return (
            <Grid container className={classes.form}>
                <Grid item sm/>
                <Grid item sm>
                    <img src={HeroLogo} alt="CompanyLogo" className={classes.logo}/>
                    <Typography variant="h2" className={classes.pageTitle}>
                        Login
                    </Typography>
                    {/* Do we need to validate the email?? */}
                    <form noValidate onSubmit={this.handleSubmit}>
                        <FormControl margin="normal" variant="outlined" sx={{width:'50ch'}}>
                            <InputLabel htmlFor="email">Email</InputLabel>
                            <OutlinedInput
                                id="email"
                                type="email"
                                value={this.state.email}
                                className={classes.textField}
                                onChange={this.handleEmailChange}
                                label="Email"
                            />
                        </FormControl>
                        <br/>
                        <FormControl margin="normal" variant="outlined" sx={{width:'25ch'}}>
                            <InputLabel htmlFor="password">Password</InputLabel>
                            <OutlinedInput
                                id="password"
                                type="password"
                                value={this.state.password}
                                className={classes.textField}
                                onChange={this.handlePasswordChange}
                                label="Password"
                            />
                        </FormControl>
                        <br/>
                        <Button 
                            type="submit"
                            variant="contained"
                            color="primary"
                            className={classes.button}
                        >
                            LOGIN
                        </Button>
                        <br/>
                        <small>Don't have an account? <Link to="/createUser">Sign up</Link></small>
                    </form>
                </Grid>
                <Grid item sm/>
            </Grid>
        )
    }
}

包.json

{
  "name": "derms-frontend",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@material-ui/core": "^4.12.3",
    "@material-ui/icons": "^4.11.2",
    "@testing-library/jest-dom": "^5.16.1",
    "@testing-library/react": "^11.2.7",
    "@testing-library/user-event": "^12.8.3",
    "axios": "^0.24.0",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-redux": "^7.2.6",
    "react-router-dom": "^6.1.1",
    "react-scripts": "4.0.3",
    "redux": "^4.1.2",
    "redux-thunk": "^2.4.1",
    "web-vitals": "^1.1.2"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "proxy": "https://north*******************************cloudfunctions.net/api"
}


我很惊讶您没有看到任何错误,原因如下:

  1. react-router-domv6 不再公开history用于导航的对象。它被替换为useNavigate返回一个钩子navigate功能。
  2. react-router-dom v6 Route组件也不再传递任何路由道具(i.e. history, location, and match),它们根本不存在。换句话说,this.props.history未定义,并且在尝试调用时会抛出错误push功能。

Since Login是一个类组件,您需要创建自己的自定义组件withRouter组件来抓取navigate函数并将其传递给Login作为道具。

const withRouter = Component => props => {
  const navigate = useNavigate();
  return (
    <Component {...props} navigate={navigate} />
  );
};

...

class Login extends Component {
  constructor(){
    super();
    this.state = {
        email: '',
        password: '',
        errors: {}
    }
  }

  handleSubmit = (event) => {
    event.preventDefault();
    const userData = {
      email: this.state.email,
      password: this.state.password
    }
    
    axios
    .post("/loginUser", userData)
    .then(res => {
      console.log(res.data);
      localStorage.setItem('FBIdToken', `Bearer ${res.data.token}`);
      this.props.navigate('/');
    })
    .catch((err) => {
      console.log("ERROR inside loginUser.js");
    })
  }

  ...

  render() {
    ...
    return (
      ...
    )
  }
}

export default withRouter(Login);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

this.props.history.push("/") 没有将我重定向到主页 的相关文章

随机推荐

  • 类型错误:无法读取未定义的属性(读取“html”)

    我正在尝试将 Jest 引入我当前的项目 然而 在初始设置过程中 我遇到了这个错误 并且无法正常运行 我该如何解决这个问题 我目前正在使用 vue cli 中的 vue2 Test suite failed to run TypeError
  • 使用 Excel 连接函数

    我正在尝试将 Excel 中三列的数据合并到一列中 例如 我想将 Product Location 和 Key id 合并到一列中 Product Location Key Id Car VA 86421910 Car VA 8642448
  • 在 header("Location: ") 调用后是否调用 exit 有关系吗?

    我似乎无法找到答案 直到我发现这个帖子 http www php net manual en function exit php 90713 on exit在 php net 上 发送 Location 标头 PHP 后will继续解析 h
  • Matlab:不正确的索引矩阵参考(或智胜matlab)

    我希望能够写jasmine http pivotal github io jasmine 类似于 Matlab 中的测试 所以像 expect myfibonacci 0 toBe 0 expect myfibonacci 5 toBe 1
  • C# 与 C++ 中的运算符 new

    来自 C 我对使用newC 中的关键字 我知道它不像 C 那样工作new从某种意义上说 您不必手动控制对象的生命周期 因为 C 具有垃圾收集功能 然而 当阅读其他人的 C 代码时 我注意到代码片段 1 中的语句 避免使用new总而言之 就像
  • 如何在模拟器android studio中设置密度

    我想创建一个 Samsung Galaxy XCover4S 720 x 1280 px 5 00 294ppi 64 6 屏幕与机身比例 的模拟器 但是我只找到了如何设置预定义的密度 如 120 240 320 和更多密度 ppi in
  • 如何识别托管 bean 中单击的 commandButton

    我有一个actionListener我的托管 bean 中的方法由许多命令按钮调用 public void verifyTestDisponibility ActionEvent actionEvent if button1 clicked
  • SQL 作为访问表单字段的控制源

    有什么方法可以使用 SQL 填充 Access Form 的文本字段值吗 我读到不可能简单地输入 SQL 作为控制源 这是真的 谢谢你的帮助 edit 我需要执行这个查询 SELECT tblCaseIssues IssueDesc FRO
  • Chartjs 插件数据标签不在图表上显示值

    我正在尝试使用 Chartjs 数据标签插件获取每个条形上的值 因此 在 a 条上方 a 想要看到数字 30 在 b 条上方或内部我想看到数字 50 但它根本没有显示任何价值 谁能帮忙并告诉我出了什么问题吗 我也尝试过使用不同版本的char
  • 让隐藏的div出现然后消失?

    让 div 出现然后淡出几秒钟的最简单方法是什么 fade div visibility none position fixed background color yellow border 1px solid black top 300p
  • 单个 CMakeLists.txt 足以满足我的项目需求吗?

    我正在尝试将旧的 CMake 移植到现代 CMake CMake 3 0 2 或更高版本 在旧的设计中 我有多个 CMakelists txt 每个目录都包含一个 CMakeLists txt 文件 我当前项目的目录结构如下所示 VizSi
  • 如何在describe()的before()块中动态生成Mocha测试?

    我正在创建一个 mocha 测试套件 该套件正在测试我们的 nwjs 应用程序正在调用的命令行实用程序 该实用程序获取文件并生成输出 json 文件 我有数千种输入文件组合和我想要生成的测试 it s 具体取决于 cmdline 实用程序的
  • 如何在 x 轴上显示每个元素的标签?

    我有包含文件名和编号的元组序列 我想绘制柱形图 其中 X 轴上有文件名 我的问题是现在 X 轴下仅显示 3 个标签 文件名 这可能是因为屏幕无法容纳更多内容 还是X轴间隔错误 如何让图表显示所有文件名 也许有办法将这些标签逆时针旋转 90
  • CSS 中具有透明背景的锯齿状边缘

    使 div 的顶部和底部边框具有锯齿状边缘 https stackoverflow com questions 18972888 make a divs top and bottom border have a jagged edge 根据
  • 如何将嵌套数据结构作为 LitElement 中的属性传递?

    在父组件中我有类似的内容 render gt const data a 1 b 1 2 3 of course this is a simplified version of the code return html
  • 为什么 Nginx 以相反的顺序提供客户端 SSL DN?

    我很好奇为什么某些 Web 服务器 例如 Nginx 以相反的顺序提供客户端 SSL DN Web 应用程序将 DN 发布到 Java Web 服务 该服务尝试创建 Javajavax naming ldap LdapName http d
  • 获取 UITableView 滚动到选定的 UITextField 并避免被键盘隐藏

    我有一个UITextField在表视图中UIViewController not a UITableViewController 如果表视图位于UITableViewController 表格会自动滚动到textField被编辑以防止它被键
  • 使用 Django 表单集保存具有唯一属性的多个对象

    TL DR 如何使用表单集保存 验证具有唯一属性的多个对象 假设我有一个Machine其中有多个Settings 参见下面的型号 这些设置在机器内应具有唯一的顺序 这可以通过定义一个来完成unique together属性中的Meta的类别
  • 创建通用 Json 序列化函数

    是否可以使用 Play Framework 2 2 在 Scala 中创建一个通用函数 将任意对象序列化为 JSON 而无需提供编写器或格式化程序 例如 此非通用代码将创建给定客户的 JSON 响应 import play api libs
  • this.props.history.push("/") 没有将我重定向到主页

    我正在尝试将此登录页面重定向到主页 但出于某种原因this props history push 没有重定向它 我有一个handleSubmit它应该在我按下登录按钮后运行 我不太确定发生了什么事 按登录按钮运行handleSubmit但是