Home > Blockchain >  trying to delete an item from a list of items
trying to delete an item from a list of items

Time:09-12

I am trying to delete an item from a list of items, but it deletes all the items in the list when page loads, i am sure its because of the map, i cant think of a way to fix this without making a detail page for the todos but i dont want to make a detail page for the todo item, any help will be appreciated

 let deleteTodo = async(id) => {
    console.log(id)
    fetch(`http://localhost:8000/api/delete/${id}/`, {
      method: "DELETE",
      headers: {
        "Content-Type": "application/json"
      },
    })
  }

 return (
    <div className="App">
      <div>
        <div>

          
          <form onSubmit={handleSubmit}>
            <label>
              Title:
              <input type="text" placeholder='Title here' onChange={handleInputChange} name="title" value={values.title} />
            </label>
            <br></br>
            <br></br>
            <label>
              Body:
              <input type="text" placeholder='Body here' onChange={handleInputChange} name="body" value={values.body} />
            </label>
            <br></br>
            <br></br>
            
            <input type="submit" value="Submit" />
          </form>

        </div>

        <div>
          {todos.map((todo, index) => (
            <div key={index}>
              <h1>{todo.title}</h1>
              <h4>{todo.body}</h4>
              <button onClick={deleteTodo(todo.id)}>delete</button>
            </div>
          ))}
        </div>

      </div>
    </div>
  );
}

CodePudding user response:

Button callback is immediately invoked upon rendering.

<button onClick={deleteTodo(todo.id)}>delete</button>

Should be called in a callback handler function.

<button onClick={() => deleteTodo(todo.id)}>delete</button>

Or make deleteTodo a curried function so it's immediately invoked and closes over the passed id value and returns a function to be called when button is clicked.

const deleteTodo = (id) => () => {
  console.log(id);
  fetch(`http://localhost:8000/api/delete/${id}/`, {
    method: "DELETE",
    headers: {
      "Content-Type": "application/json"
    },
  })
};

...

<button onClick={deleteTodo(todo.id)}>delete</button>
  • Related