Ich habe eine Singnup-Seite mit Reactjs im Frontend und Laravel im Backend entwickelt. Wenn ich auf das Schaltflächenregister klicke, wird sie auf meine Anmeldeseite umgeleitet.

Meine Anmeldekomponente lautet:

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);
        });
  }

Meine Routen sind:

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>;

Mein Index ist:

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();

Meine App.js ist:

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;

Meine React-Router-Dom-Version ist 4.3.1, wenn ich Folgendes ausführe:

typeerror: cannot read property 'props' of undefined 

Wie kann ich das beheben?

2
CodeLover 17 Jän. 2019 im 23:37

3 Antworten

Beste Antwort

Versuchen Sie, die Eigenschaft vor dem Aufruf von axios zu isolieren:

  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);
    });
1
Joao Polo 17 Jän. 2019 im 21:57

Sie sollten die Anmeldekomponente mit einer withRouter Komponente höherer Ordnung umschließen, um Zugriff auf this.props.history zu erhalten.

Weitere Informationen finden Sie in den React-Router-Dokumenten

1
Stathis Ntonas 17 Jän. 2019 im 21:10

Gerade getestet - es leitet gut um.

(innerhalb der Anmeldekomponente) ..

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>
     )
  }
}

Versuchen Sie es mit dem obigen Platzhaltercode, um zu beweisen, dass die Umleitung einwandfrei funktioniert, und ersetzen Sie sie dann durch Ihre benutzerdefinierte API + POST. Hinweis: Möglicherweise müssen Sie die stringify Nutzlast POST angeben.

Wir wissen nicht, wie Ihre App.js aussieht, aber Ihre App.js müssten auch die <Router /> -Komponente enthalten.

1
waymobetta 17 Jän. 2019 im 21:27