首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数组中删除错误项

从数组中删除错误项
EN

Stack Overflow用户
提问于 2019-02-04 23:18:38
回答 1查看 113关注 0票数 1

我有一个组件,它包含一个处于状态的项数组,但是每当我试图删除一个项目时,错误的一个就会被删除。

下面是我的父组件的简化版本:

代码语言:javascript
复制
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类只显示Bank,当按下其中的"remove“按钮时,它将使用提供的id调用onChange。我已经验证了正确的索引被传递到removeBank中。但是,在removeBank执行后,当我选择第一个项(索引0)时,最后一个项(索引1)将从bank数组中删除。我在removeBank中尝试过以下方法,但没有结果:

尝试了一个浅薄的副本:

代码语言:javascript
复制
let old = [...this.state.banks];
old.filter((item, ind) => ind !== index);
this.setState({banks: old});

尝试了一种直滤器:

代码语言:javascript
复制
this.setState({banks: this.state.banks.filter((item, ind) => ind !== index);

试过一份深版:

代码语言:javascript
复制
let old = [...this.state.banks];
old = old.map(i => Object.assign({}, i));
old.filter((item, ind) => ind !== index);
this.setState({banks: old});

试过接合:

代码语言:javascript
复制
this.setState({banks: this.state.banks.splice(index, 1)});

尝试了一种浅薄的复制和拼接:

代码语言:javascript
复制
let old = [...this.state.banks]
old = old.splice(index, 1);
this.setState({banks: old});

尝试了一种深层次的复制和拼接:

代码语言:javascript
复制
let old = [...this.state.banks];
old = old.map(i => Object.assign({}, i));
this.setState({banks: old.splice(index, 1)})

所有这些都没有奏效,它们都表现出了相同的行为。我在这件事上束手无策,任何建议都会受到极大的感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-04 23:26:37

根据文档

如果项的顺序可能发生变化,则不建议对键使用索引。这可能会对性能产生负面影响,并可能导致组件状态问题。请查看罗宾·波科尼的文章,以获得关于使用索引作为关键的负面影响的深入说明。如果选择不为列表项分配显式键,则将默认使用索引作为键。

使用一个稳定的ID,并使用它从数组中删除元素,应该可以解决您的问题。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54525737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档