【问题标题】:How to redirect to another page using history on React js?如何使用 React js 上的历史记录重定向到另一个页面?
【发布时间】:2019-01-17 20:37:50
【问题描述】:

我在前端使用 Reactjs 并在后端使用 laravel 开发了一个 Singnup 页面,我希望当我点击按钮注册时,它将被重定向到我的登录页面。

我的注册组件是:

handleSubmit =  event => {
    event.preventDefault();
    const users = {
      name:this.state.name,
      email:this.state.email,
      cin:this.state.cin,
      phoneNumber:this.state.phoneNumber,
      birthDate:this.birthDate,
      password:this.state.password
    }

    console.log(users)

      axios({
        method: 'post',
        url: 'http://172.16.234.24:8000/api/register',
        data: users,
        headers: {
          'Access-Control-Allow-Origin': '*',
          'Content-Type': 'application/json',
          'Accept': 'application/json',
        }
        })
        .then(function (response) {
          console.log(response);
          this.props.history.push('/login');
        })
        .catch(function (response) {
            console.log(response);
        });
  }

我的路线是:

import React from "react";
import { Route, Switch, } from "react-router-dom";
import Home from "./Home";
import NotFound from "./NotFound";
import Login from "./Login";
import Signup from "./Signup";

export default () =>
  <Switch>
    <Route path="/" exact component={Home} />
    <Route path="/login" exact component={Login} />
    <Route path="/signup" exact component={Signup}  />
    <Route component={NotFound} />

  </Switch>;

我的索引是:

import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router } from "react-router-dom";
import App from './App';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(
<Router>
    <App />
</Router>
    , document.getElementById('root'));
serviceWorker.unregister();

我的 App.js 是:

import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { Nav, Navbar, NavItem } from "react-bootstrap";
import { LinkContainer } from "react-router-bootstrap";
import Routes from "./Routes";
import './App.css';

class App extends Component {
  render() {
    return (
      <div className="App container">
        <Navbar fluid collapseOnSelect>
          <Navbar.Header>
            <Navbar.Brand>
              <Link to="/">Home</Link>
            </Navbar.Brand>
            <Navbar.Toggle />
          </Navbar.Header>
          <Navbar.Collapse>
            <Nav pullRight>
              <LinkContainer to="/signup">
                <NavItem>Signup</NavItem>
              </LinkContainer>
              <LinkContainer to="/login">
                <NavItem>Login</NavItem>
              </LinkContainer>
            </Nav>
          </Navbar.Collapse>
        </Navbar>
        <Routes />
      </div>
    );
  }}
export default App;

我的 react-router-dom 版本是 4.3.1,当我运行时,我得到了:

typeerror: cannot read property 'props' of undefined 

我该如何解决这个问题?

【问题讨论】:

  • 尝试在then回调上使用箭头函数。
  • @gugadev 我试试:.then =(response)=&gt; { console.log(response); this.props.history.push('/login'); } 但它仍然是同样的问题。
  • 看,这个函数会在axios上运行。也许您需要保留“this”以供内部使用。

标签: javascript reactjs react-router react-router-v4 react-router-dom


【解决方案1】:

尝试在axios调用之前隔离属性:

  let { history } = this.props

  axios({
    method: 'post',
    url: 'http://172.16.234.24:8000/api/register',
    data: users,
    headers: {
      'Access-Control-Allow-Origin': '*',
      'Content-Type': 'application/json',
      'Accept': 'application/json',
    }
    })
    .then(function (response) {
      console.log(response);
      history.push('/login');
    })
    .catch(function (response) {
        console.log(response);
    });

【讨论】:

  • @CodeLover 我一直在尝试隔离属性,之后更容易阅读:-)
【解决方案2】:

您应该使用withRouter 高阶组件包装注册组件以获取对this.props.history 的访问权限。

More info in react-router docs

【讨论】:

  • 我尝试了withRouter,但仍然是同样的问题。
  • 关于注册组件是函数组件的问题,你需要将其转换为类组件,这就是this未定义的原因(因此错误)。
【解决方案3】:

刚刚测试过——它重定向就好了。

(在注册组件中)..

import React, { Component } from "react";
const axios = require('axios');

export default class Signup extends Component {

  constructor(props) {
    super(props); 

    this.state = {}
  }

  handleSubmit = event => {
      event.preventDefault();

        axios({
          method: 'get',
          headers: {
            "Content-type": "application/json"
          },
          url: 'https://jsonplaceholder.typicode.com/todos/1'
          }).then(response => {
            console.log(response); 
            this.props.history.push('/login');
          })
          .catch(response => {
              console.log(response);
          });
    }
  render() {
    return(
       <form onSubmit={this.handleSubmit}>
        <button
          type="submit">
          yo
        </button>
       </form>
     )
  }
}

尝试使用上述占位符代码来证明重定向不会失败,然后替换为您的自定义 API + POST。注意:你可能需要stringifyPOST有效载荷。

我们不知道您的 App.js 是什么样的,但您的 App.js 还需要包含 &lt;Router /&gt; 组件。

【讨论】:

  • 您可以将&lt;form onSubmit&gt; 属性替换为&lt;button onClick&gt; 属性,但使用onSubmit 属性会更好
  • 不行,你能看看我的App.js,我编辑我的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2012-06-12
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多