2016-12-21 4 views
2

Я использую response-redux и добавил поле 'filters' в мое состояние redux, которое содержит все фильтры, которые я хочу использовать для получения данных из моего db.Использование обновленного состояния редукции сразу после отправки

Моя цель - получать данные от db с обновленными фильтрами сразу после добавления фильтра. Это то, что я до сих пор:

--- actions.js ---

... 
    export function addFilter(filter, value) { 
     return { 
      type: 'ADD_FILTER', 
      filter: filter, 
      value: value 
     } 
    } 
... 

--- reducer.js ---

... 
     case 'ADD_FILTER': 
      return update(state, { 
       filters: { 
        $merge: { 
         [action.filter]: action.value 
        } 
       } 
      }); 
... 

--- filteringComponent.js ---

... 
    addFilterAndUpdateData(filter, value) { 
     this.props.addFilter(filter, value); 
     this.props.getData(this.props.filters); 
     // this.props.filters is connected to state.filters. 
     // it DOES update, but not right away. so when getData is dispatched 
     // this.props.filters holds the old object and not the updated one 
    } 
... 

После добавления фильтра, я хочу, чтобы отправить сразу действие GetData, чтобы получить данные с последними фильтрами из дб.

Проблема в том, что это.props.filters не обновлено. Есть ли способ «ждать» обновления?

Лучшее решение, к которому я придумал до сих пор, - использовать компоненты componentWillReceiveProps, но затем я должен добавить условия (так как я не обязательно хочу отправлять getData каждый раз, когда меняют реквизиты, только когда это происходит в результате фильтров)

Какой подход был бы здесь «реакция-редукция»?

ответ

0

Просить правый react-redux подход для этого случая, используя componentWillReceiveProps прав, а просим лучшую практику я рекомендую вам прочитать примерно следующее:

  1. redux-saga: он будет обрабатывать ваши действия асинхронных и сделать один слушать другой (что использование вами случай здесь)

  2. ImmutableJs, он будет обрабатывать для вас изменив компонент реквизита только если ее значения изменяется (whic ч в вашем случае this.props.filters, так что просто получить вам обновленные данные, если это действительно обновлено)

  3. React.PureComponent, это может быть использован вместо React.Component, это улучшит вашу визуализацию обработки производительности Реагировать компонент, проверяя глубоко в объекте реквизита, если какие-либо изменения.

Опять же, если у вас нет времени или гибкость в проекте, чтобы применить это, написав некоторые проверки в componentWillReceiveProps не является неправильным.

Смежные вопросы