路由器和专用路由器/历史问题

时间:2019-11-28 16:11:53

标签: reactjs react-router

您好,我无法重定向到在privaterouter上进行验证的页面

  

未处理的拒绝(TypeError):无法读取的属性“推”   未定义

在此行:

  

this.props.history.push(“ / home”);

我的组件:

import React, { Component } from 'react';
import api from '../services/api';
import { withRouter } from 'react-router'; 

class LoginForm extends Component {
    constructor(props){
        super(props);
        this.state = {
            login:'',
            password:'',
        };
        this.onSubmit = this.onSubmit.bind(this);
        this.onChange = this.onChange.bind(this);
    }
    async onSubmit(e){
        e.preventDefault();
        const {login, password } = this.state;

        const response = await api.post('/login', { login,password });
        const user = response.data.user.login;
        const {jwt} = response.data;

        localStorage.setItem('token', jwt);
        localStorage.setItem('user', user);
        this.props.history.push("/home");
    }
    onChange(e){
        this.setState({[e.target.name]: e.target.value});
    }

  render() {
    const { errors, login, password, isLoading } = this.state;
    return (
        <form onSubmit={this.onSubmit}>
            <label htmlFor="login">Login</label>
            <input type="text" name="login" id="login" value={login}  onChange={(e) => this.onChange(e)} placeholder="Informe seu login" />
            <label htmlFor="password">Senha</label>
            <input type="password" name="password" id="password" value={password} onChange={(e) => this.onChange(e)}   placeholder="Informe sua senha"/>
        <button className="btnEnt" type="submit">Entrar</button>
    </form>
    )
  }
}

export default withRouter (LoginForm);

我的路由器:

import React from 'react';
import { BrowserRouter, Switch, Route } from 'react-router-dom';

import Login from './pages/login/index';
import DashBoard from './pages/dashboard/index';
import PrivateRoute from './auth';

export default function Routes(){
    return(
        <BrowserRouter>
        <div>
            <Switch>
                <Route path="/" exact component = {Login}/> 
                <PrivateRoute path="/home" component = {DashBoard}/>              
            </Switch>
        </div>
        </BrowserRouter>
    );
}

我的私人路由或身份验证路由器:

import React from 'react';

import { Route, Redirect} from 'react-router-dom';

const isAuth = () => {
    console.log('a');
    if(localStorage.getItem('token') !== null) {
        console.log('true')
        return true;
    }
    return false;
};

const PrivateRoute = ({component: Component, ...rest}) => {
    return (
        <Route
            {...rest}
            render={props => 
            isAuth() ? (
                <Component {...props} />
            ): (
                <Redirect
                to={{
                    pathname: '/',
                    state: {message: 'Usuário não autorizado'}
                }}
                />
            )}
        />
    );
}
export default PrivateRoute;

我基本上有我的路由器,并且我还检查是否允许用户进入此页面,但是我无法使其正常工作。

1 个答案:

答案 0 :(得分:1)

好吧,我读了你的代码,这就是我的答案

您只需要从withRouter导入react-router-dom而不是从react-router导入)

import { withRouter } from "react-router-dom";

并像使用它

export default withRouter(LoginForm);