如何用 React 删除一个列表项(函数组件)
How to delete a list item with React (function component)
我只是在做一个简单的待办事项列表以供练习,我希望能够单击列表中的项目将其删除。我想我已经非常接近了,但无法弄清楚如何从单击的 li 中获取某种数据以将其与我的数组进行比较。
App.js
import { useState } from "react";
import "./App.css";
import Newtodo from "./NewTodo/NewTodo";
import TodoList from "./TodoList/TodoList";
let INITIAL_TODOS = [
{ id: "e1", title: "Set up meeting", date: new Date(2021, 0, 14), index: 0 },
{
id: "e2",
title: "Doctor appointment",
date: new Date(2021, 2, 14),
index: 1,
},
{ id: "e3", title: "Work on project", date: new Date(2021, 1, 22), index: 2 },
{ id: "e4", title: "Update resume", date: new Date(2021, 6, 14), index: 3 },
];
const App = () => {
const [todos, setTodos] = useState(INITIAL_TODOS);
const deleteItem = (e) => {
const newTodos = todos.filter((item) => item.index !== 1 /*This works properly with a hardcoded value(1) but how can this be done dynamically as e doesn't seem to have anything useful within it (like e.target.value)*/);
setTodos(newTodos);
};
return (
<div className="App">
<Newtodo />
<TodoList items={todos} handleDelete={deleteItem} />
</div>
);
};
export default App;
TodoList.js
import "./TodoList.css";
import Todo from "./Todo";
const TodoList = (props) => {
return (
<div className="todo-list">
<ul>
{props.items.map((todo, i) => (
<Todo
index={i}
key={todo.id}
title={todo.title}
date={todo.date}
handleDelete={props.handleDelete}
/>
))}
</ul>
</div>
);
};
export default TodoList;
Todo.js
import "./Todo.css";
const Todo = (props) => {
const month = props.date.toLocaleString("en-US", { month: "long" });
const day = props.date.toLocaleString("en-US", { day: "2-digit" });
const year = props.date.getFullYear();
return (
<li onClick={props.handleDelete} className="todo-item">
<h2>{props.title}</h2>
<span>
{day}, {month}, {year}
</span>
</li>
);
};
export default Todo;
如有任何帮助或指导,我们将不胜感激!
您需要传递要删除的元素的索引。在删除处理程序中,按索引 not 等于传递的索引
的元素过滤
const deleteItem = (index) => {
setTodos(todos => todos.filter((item, i) => i !== index));
};
并在映射中
const TodoList = (props) => {
return (
<div className="todo-list">
<ul>
{props.items.map((todo, i) => (
<Todo
index={i}
key={todo.id}
title={todo.title}
date={todo.date}
handleDelete={() => props.handleDelete(i)}
/>
))}
</ul>
</div>
);
};
最好改用 id
属性。
const deleteItem = (id) => {
setTodos(todos => todos.filter((item) => item.id !== id));
};
...
const TodoList = (props) => {
return (
<div className="todo-list">
<ul>
{props.items.map((todo, i) => (
<Todo
index={i}
key={todo.id}
title={todo.title}
date={todo.date}
handleDelete={() => props.handleDelete(todo.id)}
/>
))}
</ul>
</div>
);
};
并且为了避免子组件中的匿名回调,将 handleDelete
声明为柯里化函数。
const deleteItem = (id) => () => {
setTodos(todos => todos.filter((item) => item.id !== id));
};
...
const TodoList = (props) => {
return (
<div className="todo-list">
<ul>
{props.items.map((todo, i) => (
<Todo
index={i}
key={todo.id}
title={todo.title}
date={todo.date}
handleDelete={props.handleDelete(todo.id)}
/>
))}
</ul>
</div>
);
};
首先你需要将你的 todo id 传递给 handle delete 然后你可以在那里访问 id
{ props.items.map((todo, i) => (
<Todo
index={i}
key={todo.id}
title={todo.title}
date={todo.date}
handleDelete={()=> props.handleDelete(todo.id)}
/>
))}
您在这里访问 id
const deleteItem = (todoId) => {
const newTodos = todos.filter((item) => item.id !== todoId;
setTodos(newTodos);
};
在 Todo.js
中添加 data-index
属性
<li data-index={props.index} onClick={props.handleDelete} className="todo-item">
<h2>{props.title}</h2>
<span>
{day}, {month}, {year}
</span>
</li>
并在deleteTodo
中删除
const deleteItem = (e) => {
const newTodos = todos.filter((item) => +item.index !== +e.currentTarget.dataset.index)
setTodos(newTodos);
};
我只是在做一个简单的待办事项列表以供练习,我希望能够单击列表中的项目将其删除。我想我已经非常接近了,但无法弄清楚如何从单击的 li 中获取某种数据以将其与我的数组进行比较。
App.js
import { useState } from "react";
import "./App.css";
import Newtodo from "./NewTodo/NewTodo";
import TodoList from "./TodoList/TodoList";
let INITIAL_TODOS = [
{ id: "e1", title: "Set up meeting", date: new Date(2021, 0, 14), index: 0 },
{
id: "e2",
title: "Doctor appointment",
date: new Date(2021, 2, 14),
index: 1,
},
{ id: "e3", title: "Work on project", date: new Date(2021, 1, 22), index: 2 },
{ id: "e4", title: "Update resume", date: new Date(2021, 6, 14), index: 3 },
];
const App = () => {
const [todos, setTodos] = useState(INITIAL_TODOS);
const deleteItem = (e) => {
const newTodos = todos.filter((item) => item.index !== 1 /*This works properly with a hardcoded value(1) but how can this be done dynamically as e doesn't seem to have anything useful within it (like e.target.value)*/);
setTodos(newTodos);
};
return (
<div className="App">
<Newtodo />
<TodoList items={todos} handleDelete={deleteItem} />
</div>
);
};
export default App;
TodoList.js
import "./TodoList.css";
import Todo from "./Todo";
const TodoList = (props) => {
return (
<div className="todo-list">
<ul>
{props.items.map((todo, i) => (
<Todo
index={i}
key={todo.id}
title={todo.title}
date={todo.date}
handleDelete={props.handleDelete}
/>
))}
</ul>
</div>
);
};
export default TodoList;
Todo.js
import "./Todo.css";
const Todo = (props) => {
const month = props.date.toLocaleString("en-US", { month: "long" });
const day = props.date.toLocaleString("en-US", { day: "2-digit" });
const year = props.date.getFullYear();
return (
<li onClick={props.handleDelete} className="todo-item">
<h2>{props.title}</h2>
<span>
{day}, {month}, {year}
</span>
</li>
);
};
export default Todo;
如有任何帮助或指导,我们将不胜感激!
您需要传递要删除的元素的索引。在删除处理程序中,按索引 not 等于传递的索引
的元素过滤const deleteItem = (index) => {
setTodos(todos => todos.filter((item, i) => i !== index));
};
并在映射中
const TodoList = (props) => {
return (
<div className="todo-list">
<ul>
{props.items.map((todo, i) => (
<Todo
index={i}
key={todo.id}
title={todo.title}
date={todo.date}
handleDelete={() => props.handleDelete(i)}
/>
))}
</ul>
</div>
);
};
最好改用 id
属性。
const deleteItem = (id) => {
setTodos(todos => todos.filter((item) => item.id !== id));
};
...
const TodoList = (props) => {
return (
<div className="todo-list">
<ul>
{props.items.map((todo, i) => (
<Todo
index={i}
key={todo.id}
title={todo.title}
date={todo.date}
handleDelete={() => props.handleDelete(todo.id)}
/>
))}
</ul>
</div>
);
};
并且为了避免子组件中的匿名回调,将 handleDelete
声明为柯里化函数。
const deleteItem = (id) => () => {
setTodos(todos => todos.filter((item) => item.id !== id));
};
...
const TodoList = (props) => {
return (
<div className="todo-list">
<ul>
{props.items.map((todo, i) => (
<Todo
index={i}
key={todo.id}
title={todo.title}
date={todo.date}
handleDelete={props.handleDelete(todo.id)}
/>
))}
</ul>
</div>
);
};
首先你需要将你的 todo id 传递给 handle delete 然后你可以在那里访问 id
{ props.items.map((todo, i) => (
<Todo
index={i}
key={todo.id}
title={todo.title}
date={todo.date}
handleDelete={()=> props.handleDelete(todo.id)}
/>
))}
您在这里访问 id
const deleteItem = (todoId) => {
const newTodos = todos.filter((item) => item.id !== todoId;
setTodos(newTodos);
};
在 Todo.js
中添加data-index
属性
<li data-index={props.index} onClick={props.handleDelete} className="todo-item">
<h2>{props.title}</h2>
<span>
{day}, {month}, {year}
</span>
</li>
并在deleteTodo
const deleteItem = (e) => {
const newTodos = todos.filter((item) => +item.index !== +e.currentTarget.dataset.index)
setTodos(newTodos);
};