Это правильный способ объединения селекторов с помощью createSelector? - PullRequest
1 голос
/ 07 октября 2019

Я хотел бы объединить селекторы с помощью reselectJS, но мой код выглядит немного иначе, чем в примерах, и мне было интересно, правильно ли я использовал библиотеку?

const makeSelectCurrentPosition = () =>
  createSelector(selectGlobal, globalState => globalState.current_position);

const makeSelectSKU = () =>
  createSelector(makeSelectCurrentPosition(), substate => {
    console.log('substate is: ', JSON.stringify(substate));
    return substate.sku;
  });

const makeSelectQualityLabel = () =>
  createSelector(
    makeSelectCurrentPosition(),
    substate => substate.quality_label,
  );

const makeSelectMerchant = () =>
  createSelector(
    makeSelectCurrentPosition(),
    substate => substate.merchant_name,
  );

const makeSelectZRSStatus = () =>
  createSelector(makeSelectCurrentPosition(), substate => substate.zrsStatus);

const makeSelectPositionId = () =>
  createSelector(makeSelectCurrentPosition(), substate => substate.id);

В примере это выглядит так, как будтоони не вызывают функцию, а просто предоставляют, т.е. makeSelectCurrentPosition вместо makeSelectCurrentPosition () (без скобок), однако, когда я пытаюсь это подсостояние, не определено.

1 Ответ

1 голос
/ 07 октября 2019

Нет, вам определенно не следует вызывать параметр селектора ввода, просто предоставьте функцию селектора. Функция createSelector принимает переменное количество входных параметров - все они, но не последний, являются селекторами. И последний параметр всегда является объединителем предыдущих параметров. Объединитель - это функция, в которой входные параметры являются оцененными значениями селекторов (предыдущие параметры), например:

// subtotalSelector and taxPercentSelector are other previously defined selectors
const taxSelector = createSelector(
  subtotalSelector,
  taxPercentSelector,
  // subtotal and taxPercent are evaluated values of subtotalSelector and taxPercentSelector
  (subtotal, taxPercent) => subtotal * (taxPercent / 100)
)

// this is another correct syntax for the same example
const taxSelector = createSelector(
  [subtotalSelector, taxPercentSelector],
  (subtotal, taxPercent) => subtotal * (taxPercent / 100)
)

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

const makeSelectCurrentPosition = (state) => state.current_position;

Затем вы можете использовать его в вашем mapStateToProps (в случае, если вы используетеact-redux), следующим образом:

mapStateToProps = state => {
  selectCurrentPosition: makeSelectCurrentPosition(state)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...