Я внедряю Reselect в свой проект и немного не понимаю, как его правильно использовать. После нескольких руководств и статей о том, как использовать повторный выбор, я использовал те же шаблоны, но все же некоторые вещи не работают должным образом.
Мой селектор:
const getBaseInfo = (state) => state.Info;
const getResources = (state) => state.Resources;
export const ASelector = createSelector(
[getBaseInfo, getResources],
(items, resources) => {
let result = {};
for(const item in items) {
console.log(item);
result[item] = _.pick(items[item], ['Title', 'Type', 'Beginning', 'minAmount', 'Address'])
}
for(const item in resources) {
console.log(item);
result[item] = {...result[item], firstImage: resources[item].firstImage}
}
return result;
}
);
Компонент mapStateToProps:
function mapStateToProps(state) {
console.log(state);
return {
gridInfo: ASelector(state)
}
}
Сначала мое исходное состояние:
state = { Info: {}, Resources: {} }
Мой редуктор:
const Info = ArrayToDictionary.Info(action.payload.data.Info);
const Resources = ArrayToDictionary.Resources(action.payload.data.Info);
let resourcesKeys = Object.keys(Resources);
let infoKeys = Object.keys(Info);
let temp = { ...state };
let newInfo;
for (let item of infoKeys) {
newInfo = {
Title: Info[item].Title,
Type: Info[item].Type,
BeginningOfInvesting: Info[item].BeginningOfInvesting,
DateOfEstablishment: Info[item].DateOfEstablishment,
pricePerUnit: Info[item].PricePerUnit,
minUnits: Info[item].MinUnits,
publicAmount: Info[item].PublicAmount,
minInvestmentAmount: Info[item].MinInvestmentAmount,
EinNumber: Info[item].EinNumber,
Address: Info[item].Address,
Status: Info[item].Status,
Lat: Info[item].Lat,
Lng: Info[item].Lng,
CurrencySymbol: Info[item].CurrencySymbol,
Publicity: Info[item].Publicity
}
temp.Info[item] = { ...temp.Info[item], ...newInfo }
}
for (let item of resourcesKeys) {
temp.Resources[item] = { ...temp.Resources[item], ...Resources[item] }
}
return temp;
Когда компонент рендерится с начальным состоянием, у меня есть действие, извлекающее данные из api и сохраняющее их соответственно в состоянии внутри редукторов.
Теперь мое состояние изменилось, но после небольшой отладки кода повторного выбора я обнаружил в функции сравнения, что старое и новое состояния совпадают. Внезапно мое «старое» состояние стало уже заполнено данными newState, и это, конечно же, провалило сравнение, поскольку они стали одинаковыми.
Что-то не так с моими селекторами?
Я действительно пытался использовать его, как указано в документации, но до сих пор не могу понять, как решить мою маленькую проблему.
Большое спасибо за чтение и помощь!
state.Info
иstate.Resources
? Это звучит так, как будто ваши редукторы изменяют состояние, а не обновляют его постоянно. - person markerikson   schedule 05.09.2018