Как уничтожить объект в reducer (REACT)

#reactjs #object #redux #react-redux #reducers

#reactjs #объект #redux #react-redux #редукторы

Вопрос:

У меня есть следующие пользовательские данные в состоянии

 userData : {
 isValidCheckup: true,
 accounts: {
  userAccount: [
    {
      accountType: 'checkings',
      includeInCheckup: false
    },
    {
      accountType: 'checkings',
      includeInCheckup: false
    }
  ]
}
  

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

Вот функция редуктора, которую я использую

 case UPDATE_USER_DATA: {
  const { field, value } = action.payload; // field='checkings', value=true
  return {
   ...state,
   userData: {
     ...state.userData
   }
  }

} 
  

Как вы можете видеть, я получаю field='checkings', value=true от полезной нагрузки к редуктору. Как я могу конкретно обновить это значение до includeInCheckup свойства на основе значения поля.

Может кто-нибудь, пожалуйста, пролить немного света.

Комментарии:

1. Как вы определяете, какой элемент в userData.accounts.userAccount массиве вы хотите обновить? Или вы просто хотите обновить их все?

2. @DrewReese- на основе значения поля, которое я получаю в полезной нагрузке.

3. Правильно. ОК. В вашем примере данных у вас есть два идентичных элемента, т. Е. с одинаковыми accountType includeInCheckup значениями и . Мой вопрос в том, как вы определяете, какой элемент в массиве обновлять, или вы хотите обновить все элементы соответствующим accountType свойством?

4. @DrewReese — Когда я получаю поле как «проверки», я обновляю первый элемент массива «Учетная запись пользователя», а когда я получаю поле как «сбережения», я обновляю второй элемент массива. Это жестко запрограммировано и исправлено

5. Если у вас есть только одна запись для каждого типа учетной записи, я бы предложил использовать объект с ключом по типу, а не массив.

Ответ №1:

Когда я получаю поле как «проверки», я обновляю первый элемент массива «UserAccount», а когда я получаю поле как «сбережения», я обновляю второй элемент массива.

Например, state, я предполагаю userAccount[0] userAccount[1] , что это тип текущего счета и тип сберегательного счета, а массив всегда будет иметь длину 2.

 userData : {
 isValidCheckup: true,
 accounts: {
  userAccount: [
    {
      accountType: 'checkings',
      includeInCheckup: false
    },
    {
      accountType: 'savings',
      includeInCheckup: false
    }
  ]
}
  

Скопируйте каждый уровень состояния, который обновляется, а затем обновите свойство, создав новую ссылку на объект / массив. Вы можете просто сопоставить userAccount массив и проверить, соответствует ли тип учетной записи типу поля полезной нагрузки действия, и обновить includeInCheckup свойство.

 case UPDATE_USER_DATA: {
  const { field, value } = action.payload; // field='checkings', value=true
  return {
    ...state,
    userData: {
      ...state.userData,
      accounts: {
        ...state.userData.accounts,
        userAccount: state.userData.accounts.map((account) =>
          account.accountType === field
            ? {
                ...account,
                includeInCheckup: value
              }
            : account
        )
      }
    }
  };
}
  

Комментарии:

1. Resse- Если у меня нет AccountType в качестве поля, ваш код решения, в котором есть поле account.AccountType ===, не будет существовать. Как бы вы сопоставили значение и обновили его, чтобы включить свойство includeInCheckUp в этом случае?

2. @RaviK Вы сказали, что массив был жестко запрограммирован для включения двух элементов, по одному из «проверок» и «сбережений». UPDATE_USER_DATA Предполагается ли, что вы также добавляете пользовательские данные? Наверное, я не совсем понимаю ваши данные и вариант использования (извините, если это только меня смущает). Шаблон для этого заключается в том, чтобы сначала выполнить поиск в массиве, если элемент существует со свойством / значением, которое вы хотите обновить, если он существует, тогда вы сопоставляете, как я предложил, в противном случае вы все равно копируете данные и добавляете новый элемент object .