重新选择选择器始终返回对数组的新引用



我正在向项目添加一个新功能,并且由于我从头开始编写还原器,因此我决定最终给出正常的状态,重新选择和不成熟的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对其进行了更新。这有一个新的参考文献,因此现在您的重新选择选择器将再次执行其工作。

最新更新