简体   繁体   中英

Changing attribute in state React.js

I'm doing Todo App in React and I'd use some help. This is probably trivial question, but I don't know how to do it.

context.js:

const initialState = {
isSidebarOpen: true,
isLoading: false,
isEditing: false,
todos: [
    { id: 1608592490852, todo: "Buy milk", important: false },
    { id: 1608592490939, todo: "Take out trash", important: false },
    { id: 1608634291740, todo: "Buy flowers for mom", important: false },
    { id: 1608634291874, todo: "Repair washing machine", important: false },
],
importantTodos: [{ id: 1608634291874, todo: "Repair washing machine" }],};

const handleAction = (e, item) => {
    const { id, todo } = item;
    const actionName = e.target.getAttribute("name");       
    
    if (actionName === actionTypes.addImportant) {
        dispatch({ type: actionTypes.addImportant, payload: id });
    }

reducer.js:

const reducer = (state, action) => {
const { todos } = state;

switch (action.type) {
    

    case actionTypes.addTodo:
        return {
            ...state,
            todos: [...state.todos, { id: action.payload.id, todo: action.payload.todo, important: false }],
        };


    case actionTypes.addImportant:
        const importantTodo = todos.find((item) => item.id === action.payload);

        console.log(state);

        return {
            ...state,
            todos: [...state.todos, { ...todos, important: true }],
            importantTodos: [...state.importantTodos, { id: importantTodo.id, todo: importantTodo.todo }],
        };

    default:
        throw new Error(`No Matching "${action.type}" - action type`);
}};

When adding ToDo to importantTodos, I'd also like to change it's attribute important:false to important: true in todos array. Currently, this code works without changing the attribute when

todos: [...state.todos, { ...todos, important: true }],

line is deleted. With it it just copies all todos, and stores them as new array of objects at the todos array. I think the problem is in my spread operators as I don't understeand them as I tought I do.

Add this snippet in the addImportant case

const updatedTodos = todos.map(todoEl => {
     if(todoEl.id === action.payload){
         const {id, todo} = todoEl;
         return {id, todo, important: true} 
     }
    return todoEl;
})

Update return statement:

return {
            ...state,
            todos: updatedTodos,
            importantTodos: [...state.importantTodos, { id: importantTodo.id, todo: importantTodo.todo }],
        };

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM