Преимущество использования createSelector, когда есть только один родительский селектор - PullRequest
1 голос
/ 24 сентября 2019

Предположим, у нас есть простое хранилище редуксов:

{
  user: {
    age: 10
  }
}

И у нас есть селектор для получения пользователя:

const getUser = state => state.get('user')     // suppose we used immutable.js

Теперь у нас есть два подхода для получения возраста пользователя:

  1. используйте createSelector и используйте getUser в качестве родительского селектора:
const getAge = createSelector(
   getUser,
   user => user.get('age')
)
использовать существующий селектор напрямую:
const getAge = state => getUser(state).get('age');

Вопрос:

Какой из них лучше, относительно производительности, запоминания и т. Д.

Еще один производный вопрос:

Приведенный мною пример очень прост, давайте рассмотрим, когда речь идет об очень большом и сложном избыточном хранилище, будет ли иметь значение разница двух подходов?

1 Ответ

0 голосов
/ 24 сентября 2019

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

В качестве примера, скажем, у нас есть объект:

const profile = {
  name   : 'John',
  email,
  timezone,
  ...
  locale : 'en',
}

Если создан компонент <Translate>, который тесно связан с языковым стандартом, но не с другими частями профиля, такими как имя и т. Д., Тогда имеет смысл использовать селектор для getLocale() (и это то, как мы реализуем нашу локальcomponent).

С другой стороны, если у вас есть страница профиля, где пользователи могут редактировать различные поля, то эта страница, скорее всего, должна часто повторно визуализироваться при внесении изменений, поэтому имеет смысл простона этой странице есть селектор getProfile().

Мы обрабатываем довольно сложное и большое состояние Redux, например, потому что мы используем currentUserId или userName повсюду в нашем веб-приложении.У нас есть специальные селекторы для них, чтобы воспользоваться преимуществами запоминания.

Но для теста или задания мы используем один селектор getQuizContents() вместо его внутренних полей, так какмы знаем, что большинству компонентов, которые нуждаются в информации о тесте, нужно не просто имя, а множество внутренних полей, таких как дата, количество вопросов и т. д.

...