Я новичок в 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,
}
}
Итак, но все же, он не отображает целевой экран, а также не переходит на частный маршрут после входа в систему. кто-нибудь может сказать мне, почему это происходит? Спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку вы используете 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, BrowserRouter для маршрутизации и передать объект истории, который вы используете в создателе действий
Большое спасибо, я изменил это на маршрутизатор и его работу, но я немного изменил свой код, чтобы я мог добавить туда загрузчик. погода правильная или неправильная?
Куда добавить загрузчик, не достал
И во-первых, после ответа на вход в течение некоторой доли секунд я также вижу страницу входа в систему, и меня перенаправляют на маршрут /. Есть какая-то конкретная причина?
isFetching? <Загрузка />: эта строка в частном маршруте
Похоже, что isFetching ? <Loading /> : должен быть до проверки hasLoggedIn. Не уверен насчет времени ожидания перед изменением маршрута
Я пробовал это, но это дает мне некоторые ошибки, не могли бы вы предложить немного в ответ? Просто просьба.
Обновил мой ответ, но, конечно, вам нужно передать значение isFetching в PrivateRoute в качестве реквизита
вы использовали props.location, но сейчас он не определен.
есть ли какая-то конкретная причина, по которой mapStateToProps не вызывается после обновления состояния?
Я не знаю, как с этим помочь, глядя на приведенный выше код.
Вы проверили мой обновленный код, потому что isFetching не определен в вашем компоненте PrivateRoute
Я только что добавил это.
На самом деле я поступал неправильно. Я не вызывал маршрут / при успешном входе в систему, я сразу же вызывал другой api, и в случае успеха я вызывал /. Итак, из-за этого после успешного входа в систему он не менял маршрут на /, поэтому из-за этого PrivateRoute не будет вызываться. А может быть, он не показывал тот загрузчик. Это мое понимание.
Вы используете BrowserRouter, но пользовательский объект истории, который плохо синхронизируется вместе