Вопрос проверяет понимание механизма подписки компонентов на Redux store и принципов обновления данных.
Селекторы вызываются при любом изменении store, потому что Redux не знает, какие данные реально изменились.
Store сообщает подписчикам о любом обновлении состояния.
Селекторы сами решают, изменился ли нужный им фрагмент.
Это нормальное поведение Redux.
Redux использует широкую модель уведомлений, а не точечные события.
Селектор — это функция, которая извлекает часть данных из состояния Redux store.
При каждом dispatch:
reducer возвращает новое состояние
store уведомляет всех подписчиков
каждый подписчик повторно вызывает свои селекторы
Redux не анализирует, какие части состояния изменились.
Такой подход:
упрощает реализацию Redux
делает поведение предсказуемым
перекладывает оптимизацию на уровень селекторов
Чтобы избежать лишних вычислений:
используют мемоизированные селекторы
применяют reselect
Мемоизация позволяет:
вернуть старое значение
предотвратить лишний перерендер
В React:
useSelector сравнивает результаты селектора
при равенстве по ссылке перерендер не происходит
Селекторы вызываются всегда, но перерендер зависит от результата. Оптимизация достигается мемоизацией селекторов.