reactjs - 无法删除列表中正确的一项
问题描述
这是 App.js 中的代码
const completeTask = (index) => {
let itemsCopy = [...taskItems];
itemsCopy.splice(index, 1);
setTaskItems(itemsCopy);
}
var tasksArr = taskItems.map((item, index) => {
return(
<Todo key={index} text={item} title={index+1} completeTask={completeTask}/>
)
})
这是 Todo.js
function Todo(props) {
return (
<div className="todo-container">
<h2 className="todo-title">{props.title}.</h2>
<h3 className="todo-content">{props.text}</h3>
<button onClick={() => props.completeTask(props.key)} className="todo-delete">Delete</button>
</div>
)
}
当我每次单击列表上的删除按钮时,列表中的第一个将被删除。似乎它不知道正确的索引号。
解决方案
映射可删除、添加或更新的组件时,切勿使用索引作为键。
密钥对于该项目应该是唯一的。如果将其设置为索引,并且删除列表中的第一个 todo,则所有其他 todo 将获得一个新键(React 会认为 todo 1 现在是 Todo 0,Todo 2 现在是 Todo 1,等等。)这个代码可能会删除正确的项目,但 React 会因为所有待办事项的键都发生变化而感到困惑。
解决方案是使用这样的唯一键:
const [taskItems, setTaskItems] = useState([{id: 1, text: "My Todo"}, {id: 2, text: "My Other Todo"}])
const completeTask = (id) => {
let itemsCopy = [...taskItems];
//Find the index of that object with its id
let index = itemsCopy.findIndex(x => x.id === id);
itemsCopy.splice(index, 1)
setTaskItems(itemsCopy);
}
var tasksArr = taskItems.map((item, index) => {
return(
<Todo key={item.id} id={item.id} text={item.text} title={index+1} completeTask={completeTask}/>
)
})
然后在你的 Todo 组件中
function Todo(props) {
return (
<div className="todo-container">
<h2 className="todo-title">{props.title}.</h2>
<h3 className="todo-content">{props.text}</h3>
<button onClick={() => props.completeTask(props.id)} className="todo-delete">Delete</button>
</div>
)
我不确定,但我认为您甚至无法访问 props.key。您需要使用自己的 ID。在这里阅读更多
推荐阅读
- python - 如何对树状图的叶子标签进行聚类?
- r - Dplyr 按组的行数,不包括零
- vhdl - 如何在依赖的多个进程中使用敏感度列表
- ios - 为什么 addTarget 不调用函数?
- angular7 - Angular 7:NgFor 仅支持绑定到 Iterables,例如 Arrays
- android - 如何将两个值与android中的if语句进行比较
- python - Python Automagica unicode 文本
- c - 将指向字符串的指针作为参数传递给函数时发生冲突类型错误
- python-3.x - 如何 cd 到名称以 2.* 开头的目录?,目录名称可以是 2.1 或 2.6 或 2.anything
- python - SCons 似乎没有安装 (Windows)