@ Предложение Юви использовать селектор - хорошая идея. Это позволяет вам фильтровать ваш список без изменения состояния вашего редуктора. Это важно в вашем случае, потому что при вашем текущем подходе каждый раз, когда вы меняете фильтр, вы удаляете больше данных из своего состояния, а именно:
- Выбор
food
> myRecommendations
содержит только food
элементовтеперь - Выберите
shop
> myRecommendations
пусто, потому что shop
элементов было удалено выше
Redux содержит документацию, объясняющую, как это сделать здесь . Без селекторов вам потребуется способ перезаполнения вашего состояния myRecommendations
между вызовами фильтра.
Использование чего-то вроде reselect
(см. здесь ) поможет повысить производительность, запомнив селектор,но основная концепция заключается в следующем:
- Сохранение неотфильтрованных результатов в вашем состоянии
- Сохранение выбранного фильтра как его собственного состояния
- Фильтрация данных там, где они необходимыв состоянии фильтра
то есть:
filter.js - Установите выбранный фильтр
onButtonPress() {
const { shop, food } = this.state;
this.props.setRecommendationsFilter({ shop, food });
}
Где бы вы не определилиимена ваших действий
const SET_RECOMMENDATIONS_FILTER = 'SET_RECOMMENDATIONS_FILTER';
action.js
export const setRecommendationsFilter = (filter) => {
return {
type: SET_RECOMMENDATIONS_FILTER,
filter,
};
reducer.js - Сохранить выбранный фильтр без измененияданные рекомендаций
export const reducer = (state = INITIAL_STATE, action) => {
switch (action.type) {
case SET_RECOMMENDATIONS_FILTER: {
return {
...state,
recommendationsFilter: action.filter,
};
}
}
};
Где вы используете отфильтрованные рекомендации - Это концепция селектора
// 1. Bring in myRecommendations and recommendationsFilter from redux
// 2. Filter
/**
* Get a filtered list of items, where the filter that matches
* the recommendation 'type' is set to 'true'
*/
const filteredRecommendations = myRecommendations.filter(
(item) => recommendationsFilter[item.type]
);
// 3. Now use filteredRecommendations as you would have used myRecommendations
При использовании чего-то вроде повторного выбора вы должны поставить логикусоздает filteredRecommendations
вместе с логикой для получения нужных вам данных отвыборщик, а затем используйте этот селектор в вашем mapStateToProps
(как описано здесь ).