Reaction-redux: действие от редуктора - PullRequest
0 голосов
/ 09 января 2019

Я хотел бы отправить действие из функции редуктора BuildingComponent, чтобы повлиять на состояние состояния InfoDrawer.

Я знаю, что в редуксе это невозможно, но я не могу придумать альтернативы. Кто-нибудь может дать мне какие-либо предложения / рекомендации?

Спасибо заранее. Любая помощь приветствуется.

BuildingComponent

//BuildingsState initial state
let initialState = {
  hasHighlight: false,
  buildings: [],
  visible: false,
}

// BuildingsState reducer
export function BuildingsState(state = initialState, action) {

  if (action.type === 'BUILDING_TOGGLE') {

    if(state.hasHighlight && state.visible) {

      // I WANT TO DISPATCH AN ACTION HERE
      // dispatch({ type: "ResetPOIs" })

    } else {
      return {
        ...state,
        visible: !state.visible
      }
    }
  }

  ...

}

InfoDrawerComponent

//initial InfoDrawer State
const initialState = {
  open: false,
  textToDisplay: "",
  link: "",
}

//InfoDrawer reducer
export function InfoDrawerState ( state = initialState, action ) {

  if (action.type === "ResetPOIs") {
    return { textToDisplay: "", link: "", open: false };
  }

  ...

}

Вот как устроено мое состояние

state = {

  BuildingsState: {
    hasHighlight: false,
    buildings: [],
    visible: false
  }

  InfoDrawerState: {
    textToDisplay: "",
    link: "",
    open: false
  }

  ...

}

Ответы [ 3 ]

0 голосов
/ 09 января 2019

вы можете создать промежуточное программное обеспечение, которое прослушивает тип действия, с которым вы хотите взаимодействовать, или вы можете использовать избыточный наблюдаемый https://redux -observable.js.org /

0 голосов
/ 09 января 2019

То, что я делал в прошлом, - это использовал избыточный-thunk (https://github.com/reduxjs/redux-thunk)) и отправлял действия из моих групповых сообщений. Групповые блоки оцениваются синхронно, так что вы можете легко получить состояние до и после отправки исходного действия. Например:

export const toggleBuilding = () => {
    return (dispatch, getState) => {
        dispatch({type: 'BUILDING_TOGGLE'});

        let {hasHighlight, visible} = getState();

        if(hasHighlight && visible) {
            //dispatch more stuff
        }
    }
};

Еще одна альтернатива - настроить подписку на ваше хранилище приказов, которая проверяет, когда hasHighlight и visible имеют значение true. Вы можете сделать это из компонента, используя connect () или прямую подписку.

0 голосов
/ 09 января 2019

Я бы предложил, чтобы редуктор infoDrawer слушал один и тот же тип действия. Если необходимо, используйте логику, которая отправляет действие, добавьте дополнительную информацию о состоянии зданий в объект действия. Для получения дополнительной информации см. раздел часто задаваемых вопросов Redux о состоянии совместного использования между редукторами .

...