【发布时间】:2019-06-28 18:14:27
【问题描述】:
我有一个组件,其中包含处于其状态的项目数组,但每当我尝试删除一个项目时,都会删除错误的项目。
这是我的父组件的简化版本:
export default class BankList extends Component {
state = {
banks: [new Bank("Name1"), new Bank("Name2")]
}
addBank() {
this.setState({banks: [...this.state.banks, new Bank("")]})
}
removeBank(index) {
let good = [];
this.state.banks.forEach((item, ind) => {
if(ind !== index){
good.push(item);
}
});
this.setState({banks: good});
}
render() {
return (
<Container>
<Content>
<List>
{this.state.banks.map((bank, index) => <BankContainer bank={bank} key={index} id={index} onRemove={() => this.removeBank(index)}/>)}
</List>
<Content>
<Right>
<Button onPress={() => this.addBank()}>
<Text>Add Bank</Text>
</Button>
</Right>
</Content>
</Content>
</Container>
)
}
}
BankContainer 类只显示银行,当按下其中的“删除”按钮时,它将使用提供的 id 调用 onChange。我已经验证了正确的索引被传递到 removeBank 中。但是,在 removeBank 执行后,当我选择第一个(索引 0)时,最后一项(索引 1)从银行数组中删除。我在removeBank中尝试了以下方法体,但无济于事:
尝试了浅拷贝:
let old = [...this.state.banks];
old.filter((item, ind) => ind !== index);
this.setState({banks: old});
尝试了直接过滤器:
this.setState({banks: this.state.banks.filter((item, ind) => ind !== index);
尝试过深拷贝:
let old = [...this.state.banks];
old = old.map(i => Object.assign({}, i));
old.filter((item, ind) => ind !== index);
this.setState({banks: old});
尝试拼接:
this.setState({banks: this.state.banks.splice(index, 1)});
尝试了浅拷贝和拼接:
let old = [...this.state.banks]
old = old.splice(index, 1);
this.setState({banks: old});
尝试了深拷贝和拼接:
let old = [...this.state.banks];
old = old.map(i => Object.assign({}, i));
this.setState({banks: old.splice(index, 1)})
这些都不起作用,它们都表现出相同的行为。我对此束手无策,任何建议将不胜感激!
【问题讨论】:
-
尽量不要使用索引,因为在添加/删除项目时索引会发生变化,这会导致响应不重新渲染某些元素。为银行分配一个实际 ID,并将其用作密钥。根据该键添加/删除。
标签: javascript arrays node.js reactjs react-native