当前位置: 首页 > 面试题库 >

删除一项会导致React删除最后一个DOM节点,而不是与该项目关联的节点

麹培
2023-03-14
问题内容

我试图使用ReactCSSTransitionGroup为列表插入和删除创建动画,但是删除动画总是只对列表的最后一项设置动画,而不是要删除的动画。

这是一个jsbin来说明这个问题。尝试按“添加”按钮以验证插入动画确实按预期工作,然后单击任何项​​目旁边的“
x”,以查看列表中最后一项被动画化而不是您尝试删除的动画的问题。

设置TransitionGroup时我做错了什么吗?还是我在CSS过渡定义中丢失了某些东西?


问题答案:

您遇到此问题的原因是您将其index用作密钥:

let nodes = items.map((item, index) => {
  let idx = index
  return (<Item key={index} value={item} index={index} _delete={this._onDelete}/>)
})

React key在虚拟DOM差异期间使用该属性来确定删除了哪个元素,但是索引永远无法充分满足此目的。

考虑以下示例:从以下数组开始,这将导致以下DOM结构:

const arr = [2, 4, 6, 8];

<li key={0}>2</li>
<li key={1}>4</li>
<li key={2}>6</li>
<li key={3}>8</li>

然后想象一下您删除了index处的元素2。现在,您具有以下数组和以下DOM结构:

const arr = [2, 4, 8];

<li key={0}>2</li>
<li key={1}>4</li>
<li key={2}>8</li>

注意,8现在位于index中2;React认为此DOM结构与最后一个DOM结构之间的区别是缺少liwith键3,因此将其删除。因此,无论您删除了哪个数组元素,生成的DOM结构都将缺少liwith键3

解决方案是为列表中的每个项目使用唯一的标识符;在现实生活中的应用程序中,您可能需要使用id字段或其他一些主键;对于这样的应用,您可以生成一个递增ID:

let id = 0;
class List extends Component {
  constructor() {
    this.state = {
      items: [{id: ++id, value: 1}, {id: ++id, value: 2}]
    }

    // ...
  }

  _onClick(e) {
    this.state.items.push({id: ++id, value: Math.round(Math.random() * 10)})
    this.setState({items: this.state.items})
  }

  // ...

  render() {
    let items = this.state.items
    let nodes = items.map((item, index) => {
      let idx = index
      return (<Item key={item.id} value={item.value} index={index} _delete={this._onDelete}/>)
    })

    // ...
  }
}


 类似资料:
  • 在本章中,我们将学习XML DOM删除节点的操作。删除节点操作是指从文档中删除指定的节点。实现此操作以移除诸如文本节点,元素节点或属性节点之类的节点。 以下是用于删除节点操作的方法 - 方法 方法 1. removeChild()方法 方法从子列表中删除指示的子节点,并将其返回。 删除子节点等同于删除文本节点。 因此,删除子节点会删除与其关联的文本节点。 语法 使用方法的语法如下 - 其中, -

  • 问题内容: 我正在练习使用链表节点,遇到了一个我不知道如何回答的问题。如何删除链接列表中的最后一个节点。下面的代码适用于所有条目的最后一个节点。最后一个不会被删除。 节点类别 主要 问题答案: 我想您的最后一个元素失败了。最后一个元素将没有元素。因此,不会将最后一个元素与传递的字符串进行比较。您应该使用调试器进行跟踪。

  • 我正在尝试从单链接列表中删除最后一个节点。但我仍然无法在代码中解决此错误。我的方法没有删除最后一个节点。调用delete方法后,它仍然显示我要删除的节点。列表的其余部分将被删除,但最后一个节点本身不会被删除。你能告诉我我遗漏了什么,或者错误在哪里吗? LinkedList: 列表: 节点:

  • 公共类LinkedList11{//私有内部类节点 }

  • 本文向大家介绍jQuery中DOM节点删除之empty与remove,包括了jQuery中DOM节点删除之empty与remove的使用技巧和注意事项,需要的朋友参考一下 前言 最近刚学了新知识,虽然是一个小知识点,但还是忍不住想和大家分享。本文的内容主要针对的是初学者,如果大家有什么意见或者问题都可以留言交流的,下面来看看详细的介绍吧。 .empty()是指对该节点后代的删除,结果是清空该节点(