我正在向项目添加一个新功能,并且由于我从头开始编写还原器,因此我决定最终给出正常的状态,重新选择和不成熟的j。但是,每当我更改它的属性之一时,我的选择器都会不断返回对同一数组的新引用,例如,在其中一张卡上更改" siteID"属性,该卡是由" scheple_doctor_agenda_agenda_agenda_change_card_card_site"触发的。
这是一个codesandbox: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;
}
};
我一直在网上阅读和比较代码数小时,无法弄清楚我做错了什么,任何帮助将不胜感激。
编辑:以下选择器是问题吗?
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;
如果我理解您正确重新选择您时,当您的操作更新商店时,将返回新列表,因为您使用返回新列表的immutablejs对其进行了更新。这有一个新的参考文献,因此现在您的重新选择选择器将再次执行其工作。