this.props.history.pu sh не работает при использовании HO C для регистратора - PullRequest
0 голосов
/ 26 мая 2020

Я написал код ниже, 1. Я хочу использовать Connect для хранения имени пользователя в локальном хранилище 2. Я использую компонент HO C для ведения журнала цель (callInfoLogger и callErrorLogger) 3.Если я использую connect и HO C вместе, то this.props.history.pu sh не работает (не перенаправляет на страницу MyDashboard)

Не могли бы вы дайте мне знать, что мне нужно сделать, чтобы исправить код?

App.js

import { BrowserRouter as Router, Route, Switch, } from "react-router-dom";
class App extends Component {
  render() {
    return (
      <Router>
        <Switch>
          <Route path="/login" component={Login} />
          <Route path="/dashboard" component={MyDashboard} />
        </Switch>
      </Router>
    )
  }
}
export default App;

Login.js
import React, { Component } from 'react';
import { withRouter } from "react-router-dom";
import { connect } from 'react-redux';
import HighLevelComponent from './HighLevelComponent';
class Login extends Component {

    state = {
        username: '',
        password: '',
        loginsuccess: true
    }

    callOnSubmit = (e) => {
        e.preventDefault();
        this.props.callErrorLogger("Inside call on Submit");

        if (this.state.loginsuccess === true) {
            this.props.callInfoLogger("Calling Info logger ");

            this.props.onLoginSuccess(this.state.username);
            this.props.history.push('/dashboard');
        }
    };

    render() {
        return (
            <body>
                <form className="login-form" onSubmit={this.callOnSubmit}>
                    <input
                        type="text" onChange={e => {
                            this.setState({
                                ...this.state,
                                username: e.target.value
                            })
                        }}
                    />
                    <input type="password"
                        onChange={e => {
                            this.setState({
                                ...this.state,
                                password: e.target.value
                            })
                        }}
                    />
                    <input type="submit" className="btnSbumit" value="LOG IN" />
                </form>
            </body>
        )
    }

}

const mapDispatchToProps = dispatch => {
    return {
        onLoginSuccess: (username) => dispatch({ type: "LOGIN_SUCCESS", username: username })
    }
}


export default withRouter(HighLevelComponent(connect(null, mapDispatchToProps)(Login)));


MyDashboard.js

import React, { Component } from 'react';
import { connect } from 'react-redux';
class MyDashboard extends Component {
    render() {
        return (
            <body>
                <h1>Welcome to React.. {this.props.username}</h1>
            </body>
        )
    }
}

const mapStateToProps = state => {
    return {
        username: state.username
    }
}

export default connect(mapStateToProps, null)(MyDashboard);


HighLevelComponent.js

import React from 'react';

    const HighLevelComponent = (WrapperComponent) => {
        class NewComponent extends React.Component {
            callInfoLogger = (infomsg) => {
                console.info(infomsg);
            }
            callErrorLogger = (errmsg) => {
                console.error(errmsg);
            }
            render() {
                return <WrapperComponent callInfoLogger={this.callInfoLogger} callErrorLogger={this.callErrorLogger} />
            }
    }
    return NewComponent;
}
export default HighLevelComponent;

1 Ответ

0 голосов
/ 26 мая 2020

В HO C names HighLevelComponent передайте свойства компоненту-оболочке следующим образом:

const HighLevelComponent = (WrapperComponent) => {
        class NewComponent extends React.Component {
            callInfoLogger = (infomsg) => {
                console.info(infomsg);
            }
            callErrorLogger = (errmsg) => {
                console.error(errmsg);
            }
            render() {
                return <WrapperComponent callInfoLogger={this.callInfoLogger} callErrorLogger={this.callErrorLogger} {...props} />
            }
    }
return NewComponent;
}

Обратите внимание на {...props} на компоненте оболочки. Таким образом, все реквизиты будут проходить дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...