Нажатие истории реакции не отображает компонент

Я новичок в react js. Я использую следующий способ для маршрута реакции:

В основном компоненте

render() {

        return (
            <div>
                <BrowserRouter>
                    <div>
                        <Switch>
                            <PrivateRoute exact path = "/" component = { LandingScreen } />
                            <PrivateRoute exact path = "/QuizSetupMain" component = {QuizSetupMain} />
                            <Route exact path = "/login" component = {LoginComponent} />
                        </Switch>
                    </div>
                </BrowserRouter>
            </div>


        )

privateRoute ->

import React from 'react';
import { Route, Redirect, withRouter } from 'react-router';
import { connect } from 'react-redux';
import Loading from '../Loader/Loading';

const PrivateRoute = ({ component: Component, hasUserLogIn, ...rest }) => {
    return <Route
        {...rest}
        render = {
            props => {
                return hasUserLogIn ?
                (
                    isFetching ? <Loading /> :  
                    <Component {...props} />
                )
                :
                (
                    <Redirect
                        to = {{
                            pathname: "/login",
                            state: { from: props.location }
                        }}
                    />
                )
            }
        }
    />
};


function mapStateToProps(state) {
    return {
        hasUserLogIn: state.LoginReducer.hasUserLogIn,
        isFetching: state.LoginReducer.isFetching
    }
}

Здесь после успешного входа в систему,

case LOGIN_SUCCESS:
            console.info("going in LOGIN_SUCCESS");
            return {
                ...state,
                hasUserLogIn: true,
                response: action.data,
                error: false,
                isFetching: true,
                loginRequest: false
            }

это состояние вернется, поэтому, если вы видите, что isFetching - это свойство, которое я использую для privateRoutes.js, то он также не вызывает этот загрузчик.

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

Итак, вот что я хочу сделать, это то, что, когда пользователь не вошел в систему, перенаправленный пользователь на страницу входа. после этого он должен быть перенаправлен на домашнюю страницу /. Итак, я делаю это из,

export function sendUserJd(data, dispatch) {
    dispatch(setFlag());
    history.push('/');
    return {
        type: FETCHING_JOBDESCRIPTION_SUCCESS,
        data: data,
    }
}

Итак, но все же, он не отображает целевой экран, а также не переходит на частный маршрут после входа в систему. кто-нибудь может сказать мне, почему это происходит? Спасибо.

Вы используете BrowserRouter, но пользовательский объект истории, который плохо синхронизируется вместе

Shubham Khatri 12.10.2018 13:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
2 422
1

Ответы 1

Поскольку вы используете custom history object в действии по изменению Route, вам необходимо использовать маршрутизатор с настраиваемым объектом history, который вы используете в создателе действия.

import { history } from 'path/to/history';

<Router history = {history}>
    <div>
        <Switch>
            <PrivateRoute exact path = "/" component = { LandingScreen } />
            <PrivateRoute exact path = "/QuizSetupMain" component = {QuizSetupMain} />
            <Route exact path = "/login" component = {LoginComponent} />
        </Switch>
    </div>
</Router>

В соответствии с условиями загрузки вы должны написать это как

const PrivateRoute = ({ component: Component, isFetching, hasUserLogIn, path, ...rest }) => {
    if (isFetching){
         return  <Loading /> 
    }
    return hasUserLogIn ?
                (
                    <Route
                       {...rest}
                       path = {path}
                       component = {Component}   
                     />
                )
                :
                (
                    <Redirect
                        to = {{
                            pathname: "/login",
                            state: { from: path }
                        }}
                    />
                )
};

Вы хотите, чтобы я сменил браузер с роутера на роутер?

ganesh 12.10.2018 14:19

@ganesh, BrowserRouter для маршрутизации и передать объект истории, который вы используете в создателе действий

Shubham Khatri 12.10.2018 14:20

Большое спасибо, я изменил это на маршрутизатор и его работу, но я немного изменил свой код, чтобы я мог добавить туда загрузчик. погода правильная или неправильная?

ganesh 12.10.2018 14:29

Куда добавить загрузчик, не достал

Shubham Khatri 12.10.2018 14:30

И во-первых, после ответа на вход в течение некоторой доли секунд я также вижу страницу входа в систему, и меня перенаправляют на маршрут /. Есть какая-то конкретная причина?

ganesh 12.10.2018 14:31

isFetching? <Загрузка />: эта строка в частном маршруте

ganesh 12.10.2018 14:31

Похоже, что isFetching ? <Loading /> : должен быть до проверки hasLoggedIn. Не уверен насчет времени ожидания перед изменением маршрута

Shubham Khatri 12.10.2018 14:34

Я пробовал это, но это дает мне некоторые ошибки, не могли бы вы предложить немного в ответ? Просто просьба.

ganesh 12.10.2018 14:51

Обновил мой ответ, но, конечно, вам нужно передать значение isFetching в PrivateRoute в качестве реквизита

Shubham Khatri 12.10.2018 14:58

вы использовали props.location, но сейчас он не определен.

ganesh 15.10.2018 08:38

есть ли какая-то конкретная причина, по которой mapStateToProps не вызывается после обновления состояния?

ganesh 15.10.2018 11:01

Я не знаю, как с этим помочь, глядя на приведенный выше код.

Shubham Khatri 15.10.2018 11:03

Вы проверили мой обновленный код, потому что isFetching не определен в вашем компоненте PrivateRoute

Shubham Khatri 15.10.2018 11:05

Я только что добавил это.

ganesh 15.10.2018 11:05

На самом деле я поступал неправильно. Я не вызывал маршрут / при успешном входе в систему, я сразу же вызывал другой api, и в случае успеха я вызывал /. Итак, из-за этого после успешного входа в систему он не менял маршрут на /, поэтому из-за этого PrivateRoute не будет вызываться. А может быть, он не показывал тот загрузчик. Это мое понимание.

ganesh 15.10.2018 11:11

Другие вопросы по теме