Лучший способ добиться удаления состоит в том, чтобы сделать что-то вроде этого:
const App = () => {
// Renamed onDeleted to setTodoData, to keep code cleaner.
const [todoData, setTodoData] = useState([
{ label: "Drink Coffee", important: false, id: 1 },
{ label: "Make Awesome App", important: true, id: 2 },
{ label: "Have a lunch", important: false, id: 3 }
]);
const onDeleted = id => {
setTodoData(todoData => todoData.filter(obj => obj.id !== id));
};
// Avoid passing anonymous functions as props, it may trigger re-renders and worsen performance.
return (
<TodoList todos={todoData} onDeleted={onDeleted} />
);
}
// Make sure to pass id here, I assume it's in itemProps, replaced the anonymous function with some prop drilling.
<li key={id} className="list-group-item">
<TodoListItem {...itemProps} onDeleted={onDeleted} />
</li>
А теперь для части кнопки (при условии, что id существует на подпорках):
const deleteItem = () => {
props.onDeleted(props.id);
};
<button
type="button"
className="btn btn-outline-danger btn-sm float-right"
onClick={deleteItem}
>
Как правило, чтобы избежать проблемы с бурением пропеллера (пропуская один и тот же пропел через несколько компонентов), я бы предложил использовать Redux (с его замечательными хуками, такими как useSelector и useDispatch). Кроме того, избегайте передачи анонимных функций в свойства компонентов.