栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

您遇到此问题的原因是您将其

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结构之间的区别是缺少
li
with键
3
,因此将其删除。因此,无论您删除了哪个数组元素,生成的DOM结构都将缺少
li
with键
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}/>)    })    // ...  }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/465202.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号