Допустим, вам нужно отобразить отфильтрованный список товаров.
Одним из подходов может быть сохранение отфильтрованного списка при каждом изменении фильтра в состоянии компонента или в другом ключе в хранилище Redux:
onFilterChange(filter) {
this.setState({
filteredProducts: this.props.products.filter(...)
})
}
лучшим подходом было бы использование кэшированных селекторов с reselect:
mapStateToProps = (state) => ({
filteredProducts: filteredProductsSelector(state)
})
Или рассчитать вычисленные данные при рендеринге, если они не используются совместно и выполняются быстро:
render() { const filteredProducts = this.props.products.filter(...);
return <div>{ filteredProducts.map(...) }</div>; }
Или используйте хук «useMemo», чтобы запомнить его:
myComp({ products }) { const filteredProducts = useMemo( () => products.filter(...), [products] );
return <div>{ filteredProducts.map(...) }</div>; }
Redux предлагает вам механизм единого источника правды. Если вы сохраняете разные представления одних и тех же данных в своем магазине или в состоянии компонента, вы нарушаете этот принцип. Вы должны сохранить необработанные данные только один раз и рассчитать все, что можно извлечь из них.
Все статьи из этой серии:
https://medium.com/@adamklein_66511/redux-bad-practices-1-lists-as-arrays-9115ba87b0ce
https://medium.com/@adamklein_66511/redux-bad-practices-2-duplicate-code-9f2f3d774d4d
https://medium.com/@adamklein_66511/redux-bad-practices-3-nested-state-6eebf1a410df
https://medium.com/@adamklein_66511/redux-bad-practices-5-duplicate-state-996d259758e3
https://medium.com/@adamklein_66511/redux-bad-practices-6-new-objects-on-the-fly-c38b503948a5
https://medium.com/@adamklein_66511/redux-bad-practices-7-mix-ui-state-with-model-data-cdca6c8d8fd9
Первоначально опубликовано на 500tech.com.