640
@640
Beginner

Почему проистодит re-render левого списка (react-redux)?

я совсем недавно в сфере программирования в целом, поэтому если этот вопрос покажется кому-то глупым, или тупым, прошу меня понять и простить.

к делу.
есть вот такое простое react приложение:
ссылка на код и изображение


цель такая:
при нажатии на карту в левом списке, она клонируется в правый список.
вот так
5c4c67145268b829690147.jpeg


state выглядит таким образом:
redux state
5c4c5eb567622135145689.jpeg

есть data - это объект {}, содержащий в себе полный список карт.
есть cards - это массив [], содержащий id карт, которые выводятся в левом списке.
есть deck - это массив [], в который добавляются id карт, которые надо вывести в правом списке.

и дерьмо в том, что при нажатии на карту в левом списке, ре-рендерятся лишние компоненты:
это видно с помощью highlight updates
5c4c663c84218856481545.png


то есть, обновляется только правый список (в него вносятся id карт), но re-render происходит и всех остальных компонентов.
почему заного рендерился левый список, если он никак не изменяется?

даже в diff видно что изменяется только массив deck:
diff
5c4c64a92a5e2237050851.png


p.s. где-то слышал, что компонент который подключен через connect, по дефолту становится pure компонентом, и не обновляется если к нему не приходит обновленное значение. но у меня это почему-то не работает.

// --------------------

помогло вот что:

удалил папку node_modules, которая шла по дефолту вместе с create-react-app, и прописал npm install.
и всё стало как надо
  • Вопрос задан
  • 347 просмотров
Решения вопроса 1
@forspamonly2
карточки в левом списке у вас перерисовываются потому, что каждая из них присоединена к редуксовскому хранилищу. точнее, перерисовываются редуксовские обёртки, которые Context.Consumer - вы их наверняка видели в реактовских девтулзах.

сам компонент действительно по умолчанию pure, но это работает как: редуксовская обёртка ловит изменение хранилища, получает новый store, вызывает ваш mapStateToProps и перерисовывает обёрнутый компонент с новыми props. а уже после этого отрабатывает shouldComponentUpdate от внутреннего PureComponent, понимает что ничего не поменялось и сам обёрнутый компонент уже не перерисовывается.

глобально, вам стоит сделать карточку тупым (презентационным) функциональным компонентом - принимать в нём на отрисовку готовый объект данных карточки, а получать и передавать его из connected компонента списка.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы