В чем преимущество использования Reselect с Redux и React?

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

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

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

yarn add reselect

затем создайте файл для каждой части состояния, например, если у нас есть продукты или объект корзины в состоянии, мы создаем для них отдельный файл. Например, мы создаем файл внутри каталога redux, который мы создали ранее, и называем его cart.selector.js.

внутри файла селектора корзины мы импортируем createSelector из reselect.

import {createSelector} from ‘reselect’; 

Затем создайте объект, который указывает на весь объект корзины.

const selectCart = state => state.cart;

Теперь пришло время выбрать каждую часть состояния корзины и запомнить каждую часть. В следующем коде мы выбираем элементы корзины и экспортируем их для использования во всех компонентах, которым это может понадобиться.

export const selectCartItems = createSelector([selectCart], cart => cart.cartItems);

Чтобы использовать его в наших компонентах, мы сначала импортируем его и вместе с импортом подключаемся из react-redux.

import {connect } from 'react-redux';
import {selectCartItems} from '../../redux/cart/cart.selectors';

И в конце создайте объект mapStateToProps, как показано ниже, и отправьте его в качестве первого аргумента компонента высокого порядка подключения.

const mapStateToProps = (state) => ({
    cartItems: selectCartItems(state),
});
export default connect(mapStateToProps)(Cart);

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

Удачи!