Использование createSelector с useSelector и селектором из другого файла какой правильный синтаксис?

#reactjs #redux #react-redux

#reactjs #redux #реагировать-redux

Вопрос:

У меня есть настройка селектора в моем файле reducer, и в моем файле react я хочу использовать useReducer и createSelector для вызова этого селектора только при изменении части состояния (state.data).

// Селектор в reducer.js

 const getScore = (state = initialState) => 
  Object.values(state.data).reduce(
    (score, { status }) =>
      status === "accepted" ? score   1 : 
      status === "rejected" ? score   10 : 
      score, 0
  );
  

// Вызов из reactComponent.js

 const score = useSelector(({ rejectionState }) => getScore(rejectionState));
  

Каким должен быть синтаксис для createSelector и изменения синтаксиса для useSelector ?

Ответ №1:

Я не уверен, что здесь происходит rejectionState , но я предполагаю, что data находится в state.rejectionState.data , а не state.data .

Вам нужна одна функция, которая выбирает объект data из хранилища, и одна функция, которая сопоставляет data его с оценкой. Затем вы используете createSelector для объединения двух. Вы можете определить эти функции отдельно как переменные или записать их непосредственно внутри createSelector .

 const {createSelector} = Reselect;

const dataSelector = (state) => state.rejectionState.data;

const getScore = (data = {}) =>
  Object.values(data).reduce(
    (score, { status }) =>
      status === "accepted"
        ? score   1
        : status === "rejected"
        ? score   10
        : score,
    0
  );

const scoreSelector = createSelector(dataSelector, getScore);

let exampleState = {
  rejectionState: {
    data: {
      someKey: {
        status: "accepted"
      },
      otherKey: {
        status: "rejected"
      }
    }
  }
};

console.log( "exampleState score is:" )
console.log( scoreSelector(exampleState) );  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/reselect/3.0.1/reselect.js"></script>