2017-01-06 7 views
0

У меня есть редуктор, который получает действие с полезной нагрузкой, которую мне нужно обновить. Проблема в том, что данные, которые мне нужно обновить в состоянии, - это вложенные данные. Я добавил свой редуктор ниже с некоторым комментарием и тем, что я пытался сделать до сих пор.Обновление вложенного состояния редукции

export default function(state=data, action){ 
    switch (action.type) { 
    case 'UPDATE_CONTACT_INFO': 
     let appointment = state[action.appointmentIndex]; // This is the appointment that needs to be updated 
     appointment.notification.contactInfo = action.payload; // this is the data that needs to be updated with the payload. I tried updating it like this but then not sure how to add it to the state. 
     return state; // Somehow need to update the state with the new state 
     break; 
    default: 
    return state; 
    } 
} 

Ниже представлена ​​моя первоначальная структура данных, которую я передаю в редуктор в качестве состояния по умолчанию.

data = [ 
     { 
     date: 'Friday, January 6', 
     time: '4:00 PM-5:00 PM', 
     notification: 
      { 
      contactInfo: [ 
       { 
       displayMethod:"Phone Call", 
       method:"Phone", 
       value:"3473686552" 
       }, 
       { 
       displayMethod:"Email", 
       method:"Email", 
       value:"[email protected]" 
       } 
      ] 
      } 
     }, 
     { 
     date: 'Saturday, January 7', 
     time: '2:00 PM-6:00 PM', 
     notification: 
      { 
      contactInfo: [ 
       { 
       displayMethod:"Phone Call", 
       method:"Phone", 
       value:"2123686552" 
       }, 
       { 
       displayMethod:"Email", 
       method:"Email", 
       value:"[email protected]" 
       } 
      ] 
      } 
     } 
    ]; 

Действие. Загрузить в данных редуктора та же структура, что и массив contactInfo в одном из назначений. [Object, Object]

ответ

1

Все проблемы этого типа могут быть решены с помощью react-addons-update пакета. Прочтите here.

Этот случай может быть решена таким образом:

export default function(state=data, action){ 
    switch (action.type) { 
    case 'UPDATE_CONTACT_INFO': 
     return update(state, {[action.appointmentIndex]:{notification: {contactInfo: {$set: action.payload}}}}); 
    default: 
    return state; 
    } 
} 
+0

Ничего себе это работает, но его запутывает, как это работает.Я читал документы, но до сих пор не понимаю, что делает эта часть. {[action.appointmentIndex]: {уведомление: {contactInfo: {$ set: action.payload}}}} –

+0

[action.appointmentIndex] - это просто номер, и как он может узнать, какой объект в массиве получить на основе что у вас есть выше –

+0

Как это работает, вы можете отметить его тик (это будет мой первый, вы знаете). И как это работает? Hm, для меня API ясен - когда ваше состояние является массивом, вы можете попасть в один из его элементов, объявив его индекс в массиве как соглашение. Да, это число, но этого достаточно - индекс массива - это число, это понятно. –

3

С помощью redux вы никогда не обновляете состояние. Вам нужно будет вернуть новый объект состояния с обновленными данными.

Для того, чтобы сделать это, вам нужно использовать либо Object.assign() или ES6 распространения оператора {...}

Я при условии ссылки на оба: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Spread_operator

Читайте на редукторах здесь: http://redux.js.org/docs/basics/Reducers.html

Обратите особое внимание на Мы не мутировать состояние пункт.

0

Вы должны использовать object.assign, чтобы изменить данные в вашем магазине

const newstateobject = Object.assign({}, state[someIndex], {notification: Object.assign({}, state[someindex].notification, {contactInfo: action.payload})}); 

return Object.assign({}, state, {[someindex]: newstateobject); 
+0

Я обновляю конкретное назначение в государстве не все назначения. У вас есть state.prointment, что это? –

+0

Я изменил свой ответ, не видел, что мы имеем дело с массивом. – thsorens

+0

state.prointment отмечает его даже часть структуры данных, как вы можете видеть. Предполагаю, вы имеете в виду состояние [action.appointmentIndex], чтобы получить конкретную встречу? –

Смежные вопросы