Как правильно отследить и сравнить изменения местоположения в моих собственных редукторах? - PullRequest
0 голосов
/ 10 января 2020

У меня есть веб-приложение 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 в этом контексте. Может быть, мой единственный вариант - отслеживать каждое изменение пути в каждом отдельном редукторе, где это имеет значение? Это было бы прискорбно, так как это именно та избыточность, от которой я надеялся избавиться.

...