【问题标题】:problem with router and privaterouter / history路由器和私有路由器/历史问题
【发布时间】:2019-11-28 16:11:53
【问题描述】:

您好,我在重定向到在私有路由器上进行验证的页面时遇到问题

未处理的拒绝(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;

我基本上有我的路由器,我也检查是否允许用户进入这个页面,但我无法让它工作。

【问题讨论】:

  • 你能显示console.log(this.props)的结果吗?
  • console.log(this.props) 为空 console.log(this.props.history) 未定义
  • 你确定吗?如果 this.props 为 null,则不能使用 this.props.history,因为您将收到“无法读取 null 的属性 'history'”错误
  • Simm 为空,不知道哪里出错了
  • 您可以将您的项目放到任何远程 git 存储库并授予我访问权限吗?我会尽力帮助你

标签: reactjs react-router


【解决方案1】:

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

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

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

并像使用它

export default withRouter(LoginForm);

【讨论】:

    猜你喜欢
    • 2017-06-11
    • 2018-05-18
    • 2020-02-13
    • 1970-01-01
    • 2021-11-01
    • 2016-05-28
    • 2015-12-23
    • 2020-08-14
    • 1970-01-01
    相关资源
    最近更新 更多