Вызов селектора из Reducer

avatar
Thiago Rodrigues
8 апреля 2018 в 00:26
3790
1
2

Могу ли я использовать селектор из редуктора?

У меня есть похожий код:

    case Action Types.ACTION: {
          const loading = getIsLoading(state) 
           return {
               atribute1: false,
               attribute2: action.payload,
           }
       }

       default: {

           return state;

       } 

   }

}


export const getState = createFeatureSelector<State>('feature');

export const getIsLoading = createSelector(

   getState,

   state => state.loading

);

Когда я сначала отправляю действие, я получаю сообщение об ошибке: "не могу прочитать "загрузка" неопределенного.

Где моя ошибка? Что-то не так с моим подходом?

Источник
Adrian Fâciu
8 апреля 2018 в 07:49
1

Рекомендуется не дублировать информацию в объекте состояния. Если вам нужно вызвать селектор в редюсере, похоже, вы сделаете именно это. Вы можете, например, создать другой селектор, который будет использовать getIsLoading и данные из этой части, чтобы получить то, что вы хотите.

Thiago Rodrigues
8 апреля 2018 в 12:52
0

@Adrian Fâciu, не могли бы вы прислать мне пример?

Ответы (1)

avatar
Adrian Fâciu
9 апреля 2018 в 18:46
2

Как я сказал в комментарии: Не рекомендуется дублировать информацию в состоянии. Если вам нужно вызвать селектор в редьюсере, похоже, вы сделаете именно это.

Этого можно избежать, создав третий редуктор более высокого порядка, который будет возвращать все необходимое из существующих.

Итак, у вас есть редюсер getIsBusy, и вы создаете еще один, который будет просто возвращать новые данные из вашего состояния, где вы хотели прочитать isBusy:

export const getAttribute = createSelector(
   getState,
   state => state.attribute

);

Теперь у вас есть getIsBusy и getAttribute в качестве селекторов, и вы можете создать третий, куда вы можете поместить любую логику, которая вам нужна:

export const getHigherOrderSelector = createSelector(
   getIsBusy,
   getAttribute,
   (isBusy, data) => {
      return { isBusy, data };
      // Or whatever other processing you might want to do here
   }
);