Как подписаться () на combReducer на Redux?

Я использую Redux на реактивно-нативный с редуксом и реактивно-редуксом. Я использую объединение (), чтобы объединить два редуктора:

const reducers = combineReducers({
  sessiontype,
  userdata
})

Теперь я подписываюсь на некоторые изменения в моих редукторах:

   store.subscribe((state, previousState) => {

       //Do something

    });

Как подписаться только на мой редуктор пользовательских данных? Потому что, когда я меняю состояние моего редуктора сессионного типа, мне нужно изменить состояние моего редуктора пользовательских данных (и это создает бесконечный цикл в моем store.subscribe(), потому что обнаружение всего редуктора изменилось.... (извините, мой плохой английский)

1 ответ

Концепция Redux заключается в том, что у вас есть только один state и один reducer, Идея, что у вас есть отдельные редукторы, - это просто деталь реализации, представленная combineReducers() - он позволяет вам думать о ваших редукторах по частям, но для вашего приложения есть просто один reducer, Проверьте обсуждение в этой теме GitHub.

mapStateToProps функция внутри react-redux Пакет позволяет выбрать, какие части reducer компонент имеет доступ к. Это может помочь вам решить вашу проблему. Когда компонент с доступом к sessiontype обновляет reducer, вы можете иметь то же самое обновление компонента userdata, Чтобы сделать это, вы просто dispatch два отдельных действия к store, Кроме того, помните, что subscribe на самом деле не дает вам доступ к store - это просто даст вам знать, что что-то изменилось. Внутри вашего subscribe функция, вам нужно позвонить getState() на самом деле читать данные. Узнайте больше здесь.

Попробуйте что-то вроде этого:

store.subscribe((state, prevState) => {

  // run a check of conditions for an action being dispatched
  // if you don't specify conditions, you'll end up in an
  // infinite loop
  if (stateHasFieldOrValue) {

     // dispatch update to sessiontype
     store.dispatch(updateSessionType(payload));

     // dispatch update to userdata
     store.dispatch(updateUserData(payload));
  }
});
Другие вопросы по тегам