Ответы пользователя по тегу Redux
  • Почему после mapStateToProps значение в props - undefined?

    @twolegs
    Потому что someText не в корне объекта. Надо доставать state.settingsReducer.someText
    Ответ написан
  • Как правильно вызывать action в redux?

    @twolegs
    Как правильно вызывать

    Сложно сказать. Тут как вам больше нравится, и какие соглашения вы принимаете при разработке. С точки зрения изоляции бизнес логики, лучше разместить это в одной саге.
    Но у этого метода так же могут быть противники, т.к. это уже не столь очевидно с точки зрения читаемости.

    Моя личная рекомендация - если уж вы используете саги, то делайте все сайд-эффекты в ней.
    Ответ написан
    Комментировать
  • Как отправить в state новое значения quantity?

    @twolegs
    1. Вы изменяете объект из payload, а не из стейта. Нужно поменять existItem, чтобы что-то изменилось.
    2. Редакс предполагает иммутабельность. Так что корректное обновление стейта в данном случае будет выглядеть так:
    const item = action.payload
          const existItem =  state.asideItems.find(item => action.payload.id === item.id);
          if(existItem)
          {
            return{
              ...state,
              asideItems: state.asideItems.map(currentItem => item.id === currentItem.id ? { ...currentItem, quantity: currentItem.quantity + 1 } : currentItem),
              total: state.total + item.price,
            }
          }
    Ответ написан
  • Как обернуть компонент в HOC при помощи compose?

    @twolegs
    HOC должен возвращать компонент, а не элемент для рендера.
    В вашем случае будет как-то так:
    const withTheme = Component => ({ userPalette, ...props }) => (
      <ThemeProvider theme={defaultMaterialTheme(userPalette)}>
        <Component {...props} />
      </ThemeProvider>
    );
    
    export default compose(
      hot,
      connect(mapStateToProps),
      withTheme,
    )(Routes);
    Ответ написан
    Комментировать
  • Как правильно возвращать получившийся state в редьюсере?

    @twolegs
    Редьюсер должен быть чистой функцией, то есть не содержать в себе сайд-эффектов. В нем не должно быть ничего асинхронного. Для асинхронных операций в redux есть middleware, например redux-thunk.
    Ответ написан
    3 комментария
  • Что сделать с reducers?

    @twolegs
    1. Если это независимые списки, то почему после ответа апи promoHeroes перезаписываются? Если идея в том, что инфу на главной всегда показывать из promo, то просто не трогать это поле при HEROES_API_LOADED.
    2. Если же промо-список должен обновляться после запроса к апи, то тут можно реорганизовать стор.
    В идеале - хранить нормализованный список героев. Примерная структура:
    const store = {
      heroes: {
        byId: { 1: { id: 1, name: 'Luke', ... }, ... },
        allIds: [1, 2, 3, ...],
      },
      promoIds: [1, 2],
    }

    Иногда нормализация кажется излишней, и кажется что работать с таким стором сложнее, но на деле это оказывается удобнее.
    Теперь, если сервисы promo и api должны формировать один общий список, то на экшенах HEROES_API_LOADED и HEROES_PROMO_LOADED необходимо мержить эти два списка в одно нормализованное хранилище heroes.
    Даже если не хочется делать нормализацию, но необходимо объединить два списка из разных сервисов, придется писать какую-то логику мержа.
    Ответ написан
    Комментировать