#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 .