Redux Реакция как изменить значение только одного элемента в массиве, полном объектов? У меня есть рабочее приложение, просто хочу убедиться, что я все делаю правильно

#reactjs #redux

Вопрос:

Еще раз: у меня есть элементы в магазине redux -> массив, содержащий объекты {id: str, val: bool}

Я хочу изменить значение obj по идентификатору, я сделал это таким образом, это работает, но я думаю, что я слишком усложнил:

 export const setItems = items => {
   return {
       type: SET_DATA,
       payload: items
   }
}

export const changeItem = id => {
    return (dispatch, getState) => {
        let cpItems = getState().items.items.map( el => // creating copy
            id === el._id ? {...el, val: !el.val} : el
        )
        dispatch(setItems(cpItems)) //sending copy
    }
}
 

и редуктор:

 const itemsReducer = (state = initialState, action) => {
    switch (action.type){
        case SET_DATA:
            return {
                ...state,
                items: action.payload
            }
        default: return state
    }
}
 

вот как это делается в redux ?

Ответ №1:

Логика в порядке, и вы можете создавать действия, содержащие логику.

Однако я бы не стал использовать удар для действия синхронизации. Я бы перенес логику в редуктор и создал определенный тип действия для changeItem :

 export const changeItem = id => ({
   type: CHANGE_ITEM,
   payload: id
})

const itemsReducer = (state = initialState, action) => {
  switch (action.type) {
    case SET_DATA:
      return {
        ...state,
        items: action.payload
      }
    case CHANGE_ITEM:
      return {
        ...state,
        items: state.items.map(el => // creating copy
          id === el._id ? {...el, val: !el.val} : el
        )
      }
    default:
      return state
  }
}