Передача объекта для обновления одного поля в массиве в Redux - PullRequest
0 голосов
/ 05 октября 2018

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

Вот мой редуктор:

const initialState = {
  plfrm: {
    plfrm_collection: plfrm_collection,
    comment_collection: comment_collection,
    selected: [
      // {
      //     plfrm_selected_key: null,
      //     plfrm_selected_name: '',
      //     like: null,
      //     comment_selected: null
      // } 
      /* this should be the body of the selected object */
    ]
  }
}
export default function PaymentInfoReducer(state = initialState, action) {
  switch (action.type) {
    case PAYMENT_INFO_PARAMS_CHANGES_PLFRM:
      return update(state, {
        plfrm: {
          ...state.plfrm,
          selected: {
            [action.id]: update(...state.plfrm.selected[action.id], {
              $push: action.data
            })
          },
        },
      })
    default:
      return state
  }
}

Вот мое действие:

export function plfrmChange(id, data) {
    return {
        type: PAYMENT_INFO_PARAMS_CHANGES_PLFRM,
        id,
        data
    }
}

И когда я передаю его из компонента, я делаю это так:

plfrmChange = (key, field, value) => {
    if(this.isPlfrmSelected(key)){ //item ald selected, update the [field]
        console.log('found')
        this.props.plfrmChange(this.findSelectedPlfrmIndex(key), {
            [field]: value
        })
    } else { //item not selected yet, so add new [field]
        console.log('not found')
        if(this.props.plfrm.selected.length === 0){ //if no item in array yet, index will b 0
            this.props.plfrmChange(0, {
                [field]: value
            })
        } else { //otherwise index will equal to length of array
            this.props.plfrmChange(this.props.plfrm.selected.length, {
                [field]: value
            })
        }
    }
}

и когда я бегу, я получаю эту ошибку:

TypeError: Cannot convert undefined or null to object
 60 | return update(state, {
  61 |     plfrm: {
  62 |         ...state.plfrm,
> 63 |         selected: {
  64 |             [action.id]: update(...state.plfrm.selected[action.id], {$push: action.data})
  65 |         },
  66 |     }

Я новичок, чтобы реагировать, и я знаю, что мой код грязный.Извинения в продвинутом.

1 Ответ

0 голосов
/ 08 октября 2018

Оператор распространения (...) может быть обновлен только до объекта или массива.

В исходном состоянии plfrm.selected является пустым массивом.Поэтому, когда вы попытаетесь получить доступ к state.plfrm.selected[action.id] в первый раз, это будет undefined.Поскольку вы применяете оператор распространения в строке 64, вы получили ошибку.Вы можете сделать что-то подобное, чтобы решить эту проблему.

...(state.plfrm.selected[action.id] || {}) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...