asp.net-mvc - 为什么 React 列表切片总是删除最后一行
问题描述
我在 Angular 中有类似的代码,效果很好。我试图将代码转换为 React 版本。它工作得很好,除非我尝试删除一行。每次删除单击都会删除最后一行。我的期望是删除我单击“删除”按钮的行。我正在传递需要删除的索引项。我提供了下面的示例,您也可以在这里尝试... https://jsfiddle.net/w6cy0bx1/11/
class MineCts extends React.Component{
constructor(props){
super(props);
this.state = {
items:[]
};
}
render(){
return(
<div>
<div><button onClick={(event)=>this.add(event)} >Add</button></div>
<div>
This is sample:
{this.state.items.map((record, index)=>{
return(
<table>
<tr key={index}>
<td> <input id="Name" value={record.Name} onChange={this.onDataChange}/> </td>
<td> <input id="Counter" value={record.Counter} onChange={this.onDataChange} /> </td>
<td><button onClick={(event)=>this.remove(event, record, index)} >Remove</button></td>
</tr>
</table>
)
})}
</div>
</div>
)
}
onDataChange(e)
{
console.log(e.target.id)
this.setState({[e.target.id]:e.target.value})
}
add(e){
let rows = this.state.items;
rows.push({});
this.setState({items:rows})
}
remove(e, record, index){
console.log(record)
console.log(index)
let rows = this.state.items;
rows.splice(index, 1);
this.setState({items:rows})
}
}
ReactDOM.render(<MineCts />, mountNode)
解决方案
经过仔细检查,问题是由于:
<tr key={record.index}>
这实际上并没有被设置,你的孩子没有唯一的密钥,所以 React 不知道这些孩子中的哪一个被修改了,所以当你删除其中一个时,它有点困惑。
您需要为每条记录提供唯一的密钥。
我更新了您的代码并用作new Date().getTime()
获取唯一密钥的快速方法。
我在https://jsfiddle.net/xk4e1z2s/2/有一个工作示例
您将看到每个记录的唯一键的值在添加时显示,并且您会注意到只有特定行被删除。
删除一行后输入字段为空的原因是您需要保存记录的输入值。
推荐阅读
- python - 使用 python 脚本从文本文件创建文件夹目录
- mongodb - 使用 Mongo 模板进行排序在 java 中不起作用
- javascript - 将数组转换为对象,其中数组值为对象键且对象值为空
- python - 我正在使用 python 抓取网站上的所有“a”标签。在“a”标签中,我想选择一些单词并存储它们
- php - 在 laravel 中旋转并保存照片
- bash - ssh user@pc 'source ~/.bashrc;printenv' 不来源 bashrc?
- html - 根据特定类的兄弟姐妹调整 div 的大小
- angular - 使用 cellrender 应用的 aggFunc 和 aggFunc 未显示在父行中
- node.js - httpServer.listen() 在 http.createServer() 之前触发。为什么?如何?
- c# - 如何在 Unity 中通过脚本编辑“参考分辨率”?