Селектор повторного выбора всегда возвращает новую ссылку на массив - PullRequest
1 голос
/ 27 июня 2019

Я добавляю новую функцию в проект, и так как я пишу редуктор с нуля, я решил наконец-то дать нормализованное состояние, выполнить повторный выбор и неизменность.Однако мой селектор продолжает возвращать новую ссылку на тот же массив всякий раз, когда я изменяю одно из его свойств, например, изменяя свойство «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;

1 Ответ

0 голосов
/ 28 июня 2019

Если я правильно понимаю, вы правильно выбрали повторный выбор, возвращая новый список, когда ваше действие обновляет магазин, потому что вы обновили его с помощью immutablejs, который возвращает новый список. У него есть новая ссылка, так что теперь ваш селектор повторного выбора снова выполнит свою работу.

...