J'ai un magasin avec des tableaux ( store.calendar [0] .todos [{title: title, etc ...}]
)
const handleSaveTodo = () => { props.addTodo({ day: 5, title: trackInput.value, description: trackTextarea.value, completed: false }); }
J'ai besoin pour ajouter un objet d'action aux todos d'index du tableau: J'ai essayé avec ce réducteur, mais j'obtiens une erreur:
state.calendar [newTodo.day] .concat n'est pas une fonction
Mon réducteur:
export const addTodoAction = (todoItem) => { return { type: ADD_TODO, todoItem } }
Mon action:
let initialState = { calendar: []} for (let i = 1; i <= 30; i++) { initialState.calendar.push({ todos: []}); } const todosReducer = (state = initialState, action) => { switch (action.type) { case ADD_TODO: const newTodo = action.todoItem; const newStore = {...state, todos: state.calendar[newTodo.day].concat(newTodo)}; return newStore; default: return state } } export default todosReducer;
Ma fonction add todo: p>
0: {todos: Array(0)} 1: {todos: Array(0)} 2: {todos: Array(0)} 3: {todos: Array(0)} 4: {todos: Array(0)}
3 Réponses :
Essayez plutôt state.calendar [newTodo.day] .todo.concat (newTodo)
. Je pense que vous essayez de .concat () sur l'objet {todo: Array (0)} plutôt que sur le tableau à l'intérieur.
vous pouvez essayer ceci:
Réducteur:
const initialState = { calendar: Array.from({length: 30}, () => ({ todos: [] })) } const todosReducer = (state = initialState, action) => { switch (action.type) { case ADD_TODO: const { todoItem } = action; const newCalendar = [...state.calendar]; newCalendar[todoItem].todos.push(todoItem); return { ...state, calendar: newCalendar } default: return state } } export default todosReducer;
Vous devez changer votre état de manière totalement immuable.
Pour cela, vous devez copier le tableau du calendrier, le jour que vous mettez à jour dans ce calendrier et la liste de tâches que vous êtes ajouter à.
Commencez par obtenir le jour
et todoItem
, vous pouvez utiliser la déstructuration:
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));
Ensuite, copiez votre calendrier, vous pouvez utiliser la syntaxe de diffusion pour cela:
return { ...state, calendar };
Ensuite, mettez à jour le jour concerné avec une copie pour ce jour, et ajoutez la nouvelle tâche à la liste of todos:
calendar[day] = { ...calendar[day], todos: [...calendar[day].todos, todoItem] };
Puis retourne l'état mis à jour:
const calendar = [...state.calendar];
Voici un exemple:
const { todoItem } = action; const { day } = todoItem;