javascript - ReactJS:从列表中删除没有ID的项目?

标签 javascript reactjs

我有一个问题,即使在查看了这里的其他一些帖子并尝试了一些东西之后,我似乎也无法解决。我正在玩 React 并制作一个快速的待办事项列表。很简单,因为我可以添加新名称并按预期将它们显示在页面上。我希望能够删除我选择的项目,为此我环顾四周,看到其他人正在做这样的事情来删除项目:

deleteName(id, e) {
    const { names } = this.state;

    this.setState({
        names: names.filter(name => name.id !== id)
    });
}

这对我来说很有意义,但我没有在我的 <li> 中添加任何 id项目所以我想我可以这样做:

this.setState({
   names: names.filter(name => name !== name)
});

但这只会删除整个列表。我究竟做错了什么?我是否应该重构如何将名称添加到数组以获取 id 并进行检查?我将在下面发布完整的组件代码。我始终感谢我能得到的任何帮助。谢谢大家。

class ContactListPage extends React.Component {
    constructor(props, context) {
      super(props, context);

      this.state = {
        names: []
      };

      this.addName = this.addName.bind(this);
      this.deleteName = this.deleteName.bind(this);
    }

  addName(name) {
    const { names } = this.state;

    if (name === '') {
        console.log('add a name first!')
    } else {
        this.setState({
          names: names.concat(name)
        });
    }
  }

  deleteName(id, e) {
    const { names } = this.state;

    this.setState({
        names: names.filter(name => name !== name)
    });
  }

  render() {
    const { names } = this.state;

    const named = names.map((name, i) => (
        <Card key={i} className='todo-list'>
            <CardText>
              <li>{name}    
                <FloatingActionButton className='fab-delete' mini onClick={this.deleteName}>
                           <i className="material-icons fab-icon-delete" style={{color: 'white'}}>-</i>
                        </FloatingActionButton>
              </li>
            </CardText>
        </Card>
    ));

    return (
        <div className='contact-list'>
          <div className="field-line">
            <NewName addName={this.addName} />
            <ul className='new-name'>
              {named}
            </ul>
          </div>
        </div>
    );
  }
}

最佳答案

您将每个名称与其自身进行比较,这将产生一个空列表,无论其中有什么(除了我猜 NaN?)。

names.filter(name => name !== name)

我认为您想将名称从 View 传递到删除函数中。自从我完成 React 以来已经有一段时间了,但是您可能可以使用 JSX 中的 lambda 来完成此操作。

deleteName(nameToDelete) {
    const { names } = this.state;

    this.setState({
        names: names.filter(name => name !== nameToDelete)
    });
}

render() {
    // Simplified to focus on the onClick change
    return names.map(name => <Card>
        ...
        <FloatingActionButton onClick={(e) => this.deleteName(name)} ... />
        ...
    </Card>);
}

如果您需要担心重复的名称,那么您可以将当前索引传递到 deleteName() 而不是字符串本身。是否有必要由您决定。

关于javascript - ReactJS:从列表中删除没有ID的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44146362/

相关文章:

javascript - 有没有办法使用 HTML Canvas 和 JavaScript 从一个点填充到它到达边界?

javascript - 影响 ("bleeding"的外部 CSS 成)shadow DOM with Polymer

javascript - SceneJS 导入模型不适用于 IE

reactjs - 在 Nextjs 中创建新门户时未定义文档

javascript - Rails 2.3.11 中未出现 CSV 下载框

javascript - 单选按钮单击失败

javascript - Material-UI 中的单选按钮组

javascript - 从 handleSubmit 函数抛出 redux-form 提交错误

javascript - 如何在 React.js 中检测页面滚动到顶部?

javascript - 如何将值设置为字符串 React-Native?