У меня есть веб-приложение React / Redux, использующее React Router , интегрированное с Connected React Router. Один аспект приложения состоит в том, что оно имеет два разных «режима». В настоящее время активный режим задается установкой специального свойства в состоянии Redux, что, конечно, выполняется путем отправки действия:
export const SET_MODE = 'actions/setMode';
export function setMode(mode) {
return dispatch => dispatch({ type: SET_MODE, mode });
}
Существуют некоторые другие части состояния, которые необходимо сбрасывать всякий раз, когда Активный режим приложения изменен. Это достигается тем, что эти редукторы импортируют и прослушивают действие, которое меняет режим, а затем просто возвращают свое состояние по умолчанию. Вот так:
import { SET_MODE } from 'actions/ui';
export default function reducer(previousState = defaultState, action) {
if (action.type === SET_MODE) {
return defaultState;
}
}
Теперь я хочу изменить это так, чтобы режим приложения указывался путем, а не путем установки его в состояние. Таким образом, я могу иметь путь в качестве единственного источника истины, который учитывает такие изящные вещи, как глубокая связь и т. Д. 1030 *. Другими словами, режим приложения будет определяться только параметром в пути, и я не буду отслеживать его в состоянии. Итак, где я сейчас получаю режим, подобный следующему:
const getMode = state => state.ui.mode
Вместо этого я бы получил его примерно так:
const getMode = state => state.router.location.pathname.match(/^\/(\w+)\//)[1]
Однако приложение все еще должно иметь возможность действовать, когда режим изменяется для сброса этих вышеупомянутых частей состояния, и именно здесь я столкнулся с проблемами.
Я могу заставить редукторы прослушивать действие LOCATION_CHANGE
, отправляемое подключенным реагирующим маршрутизатором, например this:
import { LOCATION_CHANGE } from 'connected-react-router';
export default function reducer(previousState = defaultState, action) {
if (action.type === LOCATION_CHANGE && action.payload.location.pathname /* how to compare with previous path? */) {
return defaultState;
}
}
Проблема в том, что это не следует делать при каждом изменении местоположения, только в тех, где параметр пути, который указывает режим, изменяется. Другими словами, мне нужно сравнить новый путь с предыдущим путем, чтобы определить, происходит ли изменение режима, но я не выяснил, как получить доступ к предыдущему пути в этом контексте.
Очевидно, previousState
является только частью состояния, за которое отвечает данный конкретный редуктор, и AFAIK отсюда нет никакого доступа к полному состоянию.
Кто-нибудь знает, есть ли способ получить доступ к другой части состояния из редуктора или у меня есть идея другого подхода, который я должен выбрать?
Полагаю, я мог бы просто прочитать текущий путь из фактического объекта window.location
, но это кажется немного хаки sh в этом контексте. Может быть, мой единственный вариант - отслеживать каждое изменение пути в каждом отдельном редукторе, где это имеет значение? Это было бы прискорбно, так как это именно та избыточность, от которой я надеялся избавиться.