Вложенные редукторы не обновляются - PullRequest
0 голосов
/ 02 ноября 2018

У меня проблема с вложенными редукторами.

Структура похожа на это:

const INITIAL_STATE = {
    items: [],
    planningState:null,
    loading: false,
    idx_selected : '2'
};

В state.items структура выглядит примерно так:

const mockItems = [
{
    date: "2018-08-24 15:00:00",
    type: "dropoff",
    status: null,
    id: "553",
    //many others things
},
{
    date: "2018-08-24 19:00:00",
    type: "pickup",
    status: "ordered",
    id: "553",
    //other things
},
{
    date: "2018-07-18 08:00:00",
    type: "delivery",
    status: null,
    id: "554",
    //other things
},

];

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

case SCAN_CLOSE_DONE:
  //state.items[state.idx_selected].status=done
     return{
      ...state,
      items:{
        ...state.items,
        [state.idx_selected]:{
          ...state.items[state.idx_selected],
            status: "done"
        }
      }
    };

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018
return {
  ...state,
  items: state.items.map(item =>
    {
      ...item,
      status: "done"
    }
  )
}
0 голосов
/ 02 ноября 2018

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

const items = (state = [], { type, items, item, idx_selected, status }) => {
    switch(type) {
        case SCAN_CLOSE_DONE:
        const newState = [...state];
        const item = { ...newState[idx_selected], status };
        newState[idx_selected] = item;
        return newState;

        //...

        default:
            return state;
    }
};

// just examples, actual use case might be different:
const planningState = (state = null, { type, planningState }) => type === MY_ACTION ? planningState : state;
const loading = (state = null, { type, loading }) => type === ANOTHER_ACTION ? loading : state;
const idx_select = //...

export default combineReducers({
    items,
    planningState,
    loading,
    idx_select
});
...