Я сделал перегрузку через redux
и redux-saga
.Возможно, это единственный способ добиться следующего с react-router
и react-transition-group
, потому что анимация с переключением переходов происходит в любое время, когда запускается метод рендеринга, даже если он возвращает ноль.
Я реализовал следующие действия:
const LoadingActions = {
START_LOADING: 'START_LOADING',
STOP_LOADING: 'STOP_LOADING',
REDIRECT: 'REDIRECT',
startLoading: () => ({
type: LoadingActions.START_LOADING
}),
stopLoading: () => ({
type: LoadingActions.STOP_LOADING
}),
redirect: ( url, token ) => ({
type: LoadingActions.REDIRECT,
payload: {
url,
token
}
})
};
export default LoadingActions;
В редукторах я реализовал простой загрузочный редуктор, который будет включать и выключать переменную загрузки:
import { LoadingActions } from "../actions";
const INITIAL_STATE = {
loading: false
};
export default function ( state = INITIAL_STATE, { type } ) {
switch ( type ) {
case LoadingActions.START_LOADING:
return { loading: true };
case LoadingActions.STOP_LOADING:
return { loading: false };
default:
return state;
}
}
Самая раздражающая вещь - цепь редуктора - this.props.loader.loading
.Слишком сложный для такой простой вещи.
import { combineReducers } from "redux";
...
import LoadingReducer from './LoadingReducer';
export default combineReducers( {
...
loader: LoadingReducer
} );
Эта большая часть работы идет в саге:
function* redirect ( action ) {
yield put( LoadingActions.startLoading() );
const { url } = action.payload;
switch ( url ) {
case MENU_URL.EXCHANGE:
yield call( getExchangeData, action );
break;
... other urls...
}
yield put( LoadingActions.stopLoading() );
BrowserHistory.push( url );
}
... loaders ...
function* watchRedirect () {
yield takeLatest( LoadingActions.REDIRECT, redirect );
}
const sagas = all( [
...
fork( watchRedirect )
] );
export default sagas;
Я включил слушатель в действие перенаправления, поэтому он вызовет генератор перенаправления.Он начнет загрузку и вызовет предварительную загрузку данных yield call
будет ожидать завершения предварительной загрузки и после этого прекратит загрузку и перенаправление.Хотя он не будет ждать положительного результата, поэтому предварительные загрузчики должны сами обрабатывать ошибки.
Я надеялся, что смогу избежать сложности с избыточностью с помощью встроенной функции маршрутизатора или библиотеки переходов, но у него нет таких инструментов для остановкипереход.Так что это один из лучших способов добиться перехода с предварительно загруженными данными.