Nano Hash - криптовалюты, майнинг, программирование

Обновление отдельного элемента состояния Redux, показывающее предыдущую версию

Мой редуктор обновлений для моих элементов (icdCode) в моем массиве (icdCodes) не обновляется должным образом в компоненте реакции (пока я не перезагружу весь компонент). Сначала он выдавал проблему с дублированием ключа, потому что недавно обновленный элемент в массиве отображался вместе с предыдущим элементом состояния в моем компоненте списка после запуска действия. Я придумал обходной путь с некоторыми настройками, но, что бы я ни пробовал, я не могу правильно обновить этот элемент во внешнем интерфейсе.

Начальное состояние:

state = {icdCodes: []}

Редуктор обновлений:

case UPDATE_ICD_CODE:
return {
        ...state,
        icdCodes: [...state.icdCodes, action.payload]
}

Вот отрывок из моего реагирующего компонента, загружающего список этих элементов массива (через сопоставление):

  render() {
    const { icdCodes } = this.props.icdCode;

    return (
      <Card body>
        <ListGroup flush>
              <Row>
                this.icdCodes.map(({ _id, icdCode, icdCodeValue }) => (
                <div>{icdCodeValue}</div>
                )
              </Row>
        </ListGroup>
      </Card>
    );
  }
}

IcdCodeItem.propTypes = {
  getIcdCodes: PropTypes.func.isRequired,
  icdCode: PropTypes.object.isRequired
};

const mapStateToProps = state => ({
  icdCode: state.icdCode
});

export default connect(
  mapStateToProps,
  { getIcdCodes, deleteIcdCode, updateIcdCode }
)(IcdCodeItem);

Вот что возвращает action.payload (обновленный элемент icdCode с новым значением вместо раздела «icdCode»):

{icdCodeVersion: "10", 
_id: "5b922fbae1c4241b54ea8aa4", 
icdCode: "I9", 
icdCodeValue: "jam jam", 
date: "2018-09-07T07:58:50.104Z", …}

Следующий код только частично решает проблему (позволяет мне редактировать только первый ключ (не элемент icdCode, а icdCode внутри элемента - извинения за ужасный синтаксис) моего объекта, а не весь объект):

return {
        ...state,
        icdCodes: state.icdCodes.map(
          icdCode =>
            icdCode._id === action.payload._id
              ? { ...icdCode, icdCode: action.payload.icdCode }
              : icdCode
        )
      };

  • Какова цель UPDATE_ICD_CODE? Это обновление элемента или добавление? Какая у вас форма полезной нагрузки? Можете ли вы разместить свое приложение на codeandbox.io, если это возможно? 09.09.2018
  • Твоя последняя попытка немного странная. Вы сопоставляете массив, а затем, если элемент равен 0, затем возвращаете объект, распределяя его, но снова присваивая его имя в качестве свойства вашей полезной нагрузке. 09.09.2018
  • @devserkan это метод обновления в моем редукторе для состояния icdCode (массив icdCodes в хранилище redux). Я пытаюсь обновить только одну запись в объекте icdCode. Обновление сохраняется в базе данных, но редуктор redux не обновляет отдельный элемент, он только добавляет обновленный элемент в качестве дополнительного элемента в мой список элементов icdCode. Мой action.payload возвращает обновленный элемент icdCode, который является объектом. Я обновлю свой код, чтобы добавить этот фрагмент. 09.09.2018
  • Итак, меняется только icdCode часть, верно? Тогда вы замените тот же объект этим новым? 09.09.2018
  • Точно, только тот конкретный элемент icdCode, который редактируется из массива в компоненте response icdCodeItem. Моя проблема возникла, когда я начал управлять двумя отдельными полями элемента icdCode по отдельности (обновляя только один ключ объекта за раз). 09.09.2018
  • Кроме того, я отредактировал сообщение, чтобы показать новую настройку, которую я пробовал, которая дает мне правильное обновление, но только для одного ключа редактируемого элемента icdCode. 09.09.2018
  • Я дал ответ. Надеюсь это работает. Тут уже поздно, может я что-то недопонял :) Если так, то либо кто-то другой что-то подсказывает, либо я могу завтра проверить :) 09.09.2018

Ответы:


1

Вы можете сопоставить массив icdCodes, тогда, если элемент правильный (здесь я проверяю _id), вы можете изменить его без изменения.

case UPDATE_ICD_CODE: {
  const icdCodes = state.icdCodes.map(icd => {
    if (icd._id === action.payload._id) {
      return { ...icd, icdCode: action.payload.icdCode };
    }
    return icd;
  });

  return { ...state, icdCodes };
}

** Обновление после комментариев **

Если вам нужно изменить более одного свойства, вот оно:

case UPDATE_ICD_CODE: {
  const { _id, icdCode, icdCodeValue } = action.payload;
  const icdCodes = state.icdCodes.map(icd => {
    if (icd._id === _id) {
      return { ...icd, icdCode, icdCodeValue };
    }
    return icd;
  });

  return { ...state, icdCodes };
}

Если вы хотите полностью изменить объект, это проще:

case UPDATE_ICD_CODE: {
    const { _id } = action.payload;
    const icdCodes = state.icdCodes.map(icd =>
        icd._id === _id ? action.payload : icd
    )

    return { ...state, icdCodes };
}
09.09.2018
  • Хорошо, это почти идеально, теперь моя единственная проблема заключается в том, что это работает только для обновления первого поля в объекте icdCode (icdCode - я должен был назвать этот icdCodeNumber, чтобы избежать путаницы), но не второе поле (icdCodeValue). Как я могу настроить код, чтобы обновить весь объект, а не конкретное поле icdCode? 09.09.2018
  • Меня запутали названия :) Мы меняем здесь одно свойство объекта в вашем массиве. Это icdCode собственность. Итак, как вы планируете изменить icdCodeValue свою полезную нагрузку? 09.09.2018
  • Кроме того, я проверил ваше обновленное решение. То же самое и здесь :) Вы используете тернарный оператор, я использую обычный блок if. 09.09.2018
  • Lol Я тебя не виню, это неправильно написано. Этот объект в основном icdCode: {icdCode: некоторое число, icdCodeValue: определенное значение числа}. Поэтому я хотел бы обработать изменение обоих полей одновременно в редукторе. В настоящее время он изменяет только значение полей icdCode в объекте icdCode. 09.09.2018
  • OK. Итак, новая полезная нагрузка содержит как этот новый icdCodeValue, так и icdCode, верно? 09.09.2018
  • Да =] именно так. Сама моя полезная нагрузка содержит полный редактируемый объект icdCode. Мне просто заменить icdCode на icd? следующим образом: return { ...icd, icd: action.payload }; EDIT: это не сработало = / 09.09.2018
  • Хорошо, легко. Последний вопрос: хотите ли вы сохранить что-нибудь из старого объекта icdCode или заменить его новым вполне нормально? 09.09.2018
  • Заменить его должно быть совершенно нормально, поскольку у него всего два свойства. Но мне было бы любопытно (просто чтобы знать для справки в будущем) концептуально, что изменилось бы, если бы я только поместил измененный элемент? 09.09.2018
  • Ждать. Новый объект имеет только два свойства или он имеет два разных (измененных) свойства? 09.09.2018
  • В настоящее время я обрабатываю изменения с помощью отдельных функций, поэтому после изменения одного свойства я просто присоединяю к нему другое неизмененное свойство и отправляю с ним полный объект редуктору. Таким образом, они будут изменены индивидуально (не идеально, но я не мог найти обходного пути с библиотекой, которую я использую для редактирования полей). 09.09.2018
  • Но вы можете изменить здесь два свойства с помощью новой полезной нагрузки. Может быть, поскольку уже слишком поздно (7 утра и еще не спал), может быть, что-то еще, я не совсем понимаю, как вы получаете новый объект :) Но, в конце дня, если ваш редуктор получит последний объект, и вы хотите заменить его на старый, можно просто заменить сам объект. Не нужно бороться со свойствами. Я все еще учусь, но в операциях с БД люди всегда так поступают. Чтобы обновить, сначала манипулируйте данными, затем создайте новый с этим, а затем передайте его обратно, чтобы изменить старые. Думаю, состояние не иное. 09.09.2018
  • да ладно, наконец-то я понял, приятель: { ...icd, icdCode: action.payload.icdCode, icdCodeValue: action.payload.icdCodeValue } 09.09.2018
  • Да, это то, о чем я говорю, легко :) Я собирался предоставить обновление. Позволь мне сделать это :) 09.09.2018
  • Я уже выбрал ваш ответ как правильный с момента вашего первого сообщения. Большое спасибо за вашу помощь и за то, что вы так поздно не ложились спать, чтобы помочь мне, чувак. Большое спасибо за помощь, чувак, я надеюсь, ты хорошо спишь сегодня вечером / утром, брат! 09.09.2018
  • Нет проблем, пожалуйста. Я видел, что ты принял это в первый раз, но важно сделать это до конца :) 09.09.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..