Я добавляю новую функцию в проект, и так как я пишу редуктор с нуля, я решил наконец-то дать нормализованное состояние, выполнить повторный выбор и неизменность.Однако мой селектор продолжает возвращать новую ссылку на тот же массив всякий раз, когда я изменяю одно из его свойств, например, изменяя свойство «siteId» на одной из карточек, которое вызывается действием «SCHEDULE_DOCTOR_AGENDA_CHANGE_CARD_SITE».
Вот кодовые окна: https://codesandbox.io/s/reactredux-3sulk?fontsize=14
Ниже приведено состояние:
{
cards: {
byId: {
xtNRPmeZh: {
cardId: "xtNRPmeZh",
actId: "0000000540",
specialityDesc: "MEDICINA GERAL E FAMILIAR",
staffDesc: "Abel Garcia Abejas",
staffKey: "abel|abejas|41631",
siteId: "0000000015",
siteExternalCode: "HCD",
siteExternalId: "1",
siteList: ["wto3vb3cSp", "jBZznWcTm3"],
procedureGroupTypeConsult: true,
mainSchedulingId: "FYV8gCC7-"
},
XduPAjiL8: {
cardId: "XduPAjiL8",
actId: "0000000543",
specialityDesc: "Cardiologia",
staffDesc: "Duarte Nuno Cacela",
staffKey: "duarte|cacela|32938",
siteId: "0000000010",
siteExternalCode: "HCD",
siteExternalId: "1",
siteList: ["jYyr402brR", "mfp69ivQWg"],
procedureGroupTypeConsult: true,
mainSchedulingId: "-M5ghgxzn"
}
},
allCardIds: ["XduPAjiL8", "xtNRPmeZh"]
},
siteLists: {
byId: {
wto3vb3cSp: {
value: "0000000015",
externalCode: "HCD",
externalId: "1",
label: "CUF Descobertas Hospital"
},
jBZznWcTm3: {
value: "0000000005",
externalCode: "HCIS",
externalId: "2",
label: "CUF Infante Santo Hospital"
},
jYyr402brR: {
value: "0000000015",
externalCode: "HCD",
externalId: "1",
label: "CUF Descobertas Hospital"
},
mfp69ivQWg: {
value: "0000000010",
externalCode: "CCSDR",
externalId: "10",
label: "CUF S. Domingos Rana Clínica"
}
},
allSiteResultIds: ["wto3vb3cSp", "jBZznWcTm3", "jYyr402brR", "mfp69ivQWg"]
},
currentCard: "XduPAjiL8"
}
Действие:
export const changeDoctorAgendaCardSite = (cardId, siteId) => dispatch => {
dispatch({
type: "SCHEDULE_DOCTOR_AGENDA_CHANGE_CARD_SITE",
cardId,
siteId
});
};
Редуктор:
const doctorAgendaReducer = (state = initialState, action) => {
switch (action.type) {
case "SCHEDULE_DOCTOR_AGENDA_ADD_CARD": {
return state
.mergeIn(["cards", "byId"], action.doctorAgendaCard)
.setIn(["cards", "allCardIds"], action.newAllCardIds)
.mergeIn(["siteLists", "byId"], action.newSiteLists)
.setIn(["siteLists", "allSiteResultIds"], action.newAllSiteListsIds)
.setIn(["currentCard"], action.cardId);
}
case "SCHEDULE_DOCTOR_AGENDA_CHANGE_CARD_SITE": {
return state.setIn(
["cards", "byId", action.cardId, "siteId"],
action.siteId
);
}
case "SCHEDULE_DOCTOR_AGENDA_CHANGE_CURRENT_CARD":
return state.setIn(["currentCard"], action.cardId);
default:
return state;
}
};
Я часами читаю и сравниваю код в Интернете и не могу понять, что я делаю неправильно, любая помощь будет принята.
edit: проблема со следующим селектором?
import { createSelector } from "reselect";
import getDoctorAgendaCard from "./getDoctorAgendaCard";
import getDoctorAgendaSiteArray from "./getDoctorAgendaSiteArray";
import getDoctorAgendaSiteListsById from "./getDoctorAgendaSiteListsById";
const getDoctorAgendaTargetCard = createSelector(
[getDoctorAgendaCard, getDoctorAgendaSiteArray, getDoctorAgendaSiteListsById],
(card, siteArray, siteListsById) => ({
...card,
options: siteArray.map(item => siteListsById[item])
})
);
export default getDoctorAgendaTargetCard;