Вам необходимо полностью изменить свое состояние.
Для этого вам необходимо скопировать массив календаря, день обновления в этом календаре и список задач.вы добавляете к.
Сначала получите day
и todoItem
, вы можете использовать деструктурирование:
const { todoItem } = action;
const { day } = todoItem;
Затем скопируйте свой календарь, вы можете использовать синтаксис распространения для этого:
const calendar = [...state.calendar];
Затем обновите соответствующий день с копией для этого дня и добавьте новый список задач в список задач:
calendar[day] = { ...calendar[day], todos: [...calendar[day].todos, todoItem] };
Затем верните обновленное состояние:
return { ...state, calendar };
Вот пример:
const ADD_TODO = 'add-todo';
const initialState = { calendar: Array.from({ length: 30 }, (_, i) => ({ todos: [] })) };
const todosReducer = (state = initialState, action) => {
switch (action.type) {
case ADD_TODO:
const { todoItem } = action;
const { day } = todoItem;
const calendar = [...state.calendar];
calendar[day] = { ...calendar[day], todos: [...calendar[day].todos, todoItem] };
return { ...state, calendar };
default:
return state
}
}
let state = initialState;
state = todosReducer(state, { type: ADD_TODO, todoItem: { day: 0, title: 'todo day 1' } });
state = todosReducer(state, { type: ADD_TODO, todoItem: { day: 1, title: 'todo day 2' } });
state = todosReducer(state, { type: ADD_TODO, todoItem: { day: 2, title: 'todo day 3' } });
state = todosReducer(state, { type: ADD_TODO, todoItem: { day: 2, title: 'second todo day 3' } });
console.log(state.calendar.slice(0, 3));