Редуктор не работает должным образом внутри IonRouterOutlet - PullRequest
0 голосов
/ 22 января 2020

Это основной компонент моего приложения Ionic4 (компонент "PrivateRoute" от реакции-маршрутизатора-частного):

const App: React.FC = (props: any) => {

    const { userLogged } = props.logged;

    return (
        <IonApp>
            <IonReactRouter>
                <IonRouterOutlet id="principal">
                    <Route exact path="/" render={() => <Redirect to="/login" />} />
                    <Route exact path="/login" component={LoginPage} />
                    <PrivateRoute exact path="/dashboard" component={Dashboard} authStatus={userLogged.isLogged} redirectURL="/login" />
                </IonRouterOutlet>
            </IonReactRouter>
            />
    </IonApp>
    );
}

const mapStateToProps = (state: any) => {
    return {
        logged: state.logged,
    };
}

export default connect(mapStateToProps)(App);

, а это мой компонент LoginPage:

const LoginPage: React.FC = (props: any) => {

    const { userLogged } = props.logged;

    const handleLogin = (inputs: any) => {
        const user = {
            "username": inputs.username,
            "password": inputs.password,
        };

        axios.post(`URL`,
            user,
        )
            .then(response => {
                props.setLogged(response.data);
            })
            .catch(error => {});
    }

    return (
        <>{userLogged.isLogged ?
            <Redirect to="/dashboard" />
            :
            <IonPage>
                <IonContent>
                    <>
                        <IonGrid>
                            <IonRow>
                                <IonCol
                                    offsetXl="3" sizeXl="6"
                                    offsetLg="2" sizeLg="8"
                                    offsetMd="2" sizeMd="8"
                                    offsetSm="1" sizeSm="10"
                                    sizeXs="12">
                                    <Login save={handleLogin} >
                                    </Login>
                                </IonCol>
                            </IonRow>
                        </IonGrid>
                    </>
                </IonContent>
            </IonPage>
        }
        </>
    );
};

const mapStateToProps = (state: any) => {
    return {
        logged: state.logged,
    };
}

const mapDispatchToProps = {
    setLogged,
};

export default connect(mapStateToProps, mapDispatchToProps)(LoginPage);

Компонент Login внутри LoginPage, является только формой, и не нужно go вдаваться в детали. Действие «setLogged» сохраняет только JSON с пользовательскими данными и токеном сеанса и изменяет переменную «isLogged» с редуктора на «true». Это действие работает правильно.

У меня проблема в следующем. Когда пользователь входит в систему, компонент «LoginPage» правильно обнаруживает, что переменная состояния «userLogged.isLogged» изменяется на «true», поэтому он отображает <Redirect> для компонента «Dashboard», но защищенный путь компонента «Dashboard» "не обнаруживает его (по крайней мере, так кажется). Если я размещу защищенный маршрут за пределами «IonRouterOutlet», он будет работать идеально. Но мне нужно, чтобы он был внутри «IonRouterOutlet», потому что мне нужно получить доступ к событию страниц Ioni c (useIonViewDidEnter). Как я могу это исправить? Либо путем правильной работы защищенного маршрута из «IonRouterOutlet», либо каким-либо образом имитируя «useIonViewDidEnter».

Я уже пробовал следующие защищенные маршруты:

           <Route exact path="/dashboard"
                component={userLogged.isLogged ? Dashboard : LoginPage}
            />
            <Route exact path="/dashboard"
                render={props => {
                    return userLogged.isLogged ? <Dashboard {...props} /> : <LoginPage />;
                }}
            />

Заранее спасибо

1 Ответ

0 голосов
/ 22 января 2020

В одной из последних версий исправлена ​​ошибка, из-за которой обновлялись замыкания, созданные для маршрутов. После обновления @ ionic / реагировать и @ ionic / реагировать на маршрутизатор до версии 4.11.8, я могу подтвердить, что ошибка исправлена. Также необходимо обновить @ types / реагировать на 16.9.19 и @ types / реагировать на маршрутизатор до 5.1.4, чтобы избежать таких проблем, как this

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