【react】key值使用 index和id的区别

1.key的作用:

key是虚拟Dom对象的标识,在更新显示时key有重要的作用。

2.当状态中的数据发生变化的时候,react会根据新数据生成新的Dom与旧虚拟Dom的diff比较:

(1) 旧虚拟Dom中找到了与新虚拟Dom相同的key:
若虚拟Dom中内容没变,直接使用之前的真实Dom
若虚拟Dom中内容变了,则生成的真实Dom,随后替换掉页面中之前的真实Dom
(2) 用index作为key可能引发的问题:
若数据进行:逆序添加逆序删除等破坏顺序操作:会产生没有必要的真实Dom更新。虽然页面效果没有问题,但是效率低。
若结构中包含输入类的Dom : 会产生错误Dom更新,导致界面会有问题
注意:如果不存在对数据的逆序添加,逆序删除等破坏顺序操作,仅用于渲染列表展示,使用index作为key也是可以的。

3.如何选择key值

a. 使用每一条数据的唯一标识2作为key,比如id,手机号,身份证
b. 如果确定只是简单的展示数据,也可以使用index

{
	todos.map((todo, index) => (
	   <Todo {...todo} key={index} />
	))
}

key 值是 React 用来判断 DOM 元素的唯一依据。当我们尝试向列表中添加、删除一项数据的时候会发生什么?如果 key 值和之前的相同,React 会假设这是同一个组件。

class Item extends React.Component {
	render() {
	  return (
		<div className="form-group">
			<label className="col-xs-4 control-label">{this.props.name}</label>
			<div className="col-xs-8">
				<input type='text' className='form-control' />
			</div>
		</div>
	)
}}
class Example extends React.Component {
	constructor(props) {
		super(props);
		this.state = {
			list: []
		};
	}
	addItem() {
		const id = +new Date;
		this.setState({
			list: [ {name: 'Baz' + id, id} , ...this.state.list]
		});
	}
	render() {
	  return (
		<div>
			<button className='btn btn-primary' onClick={this.addItem.bind(this)}>
			 	添加
			</button>
			// <h3>错误 <code>key=index</code></h3>
			<h3>错误 <code>key=index</code></h3>
			<form className="form-horizontal">
				{this.state.list.map((todo, index) =>
				<Item {...todo} key={index} />
				)}
			</form>
			
            // <h3>正确 <code>key=id</code></h3>
			<h3>正确 <code>key=id</code></h3>
			<form className="form-horizontal">
			{this.state.list.map((todo) =>
			<Item {...todo} key={todo.id} />
			)}
			</form>
		</div>
	)}
}

React.render(<Example />, document.getElementById('app'))

先点击添加按钮,在文本框中输入一些测试值。
再点击一次添加按钮,在列表顶部添加一个空的文本框,这时候有发现问题。
由于错误的使用 index 作为 key 值,React 在渲染 list 列表时,假定 key = 0 就是之前添加的第一个文本框,于是错误的将第一次输入的内容渲染到了我们新添加的文本框上。

解决方案
使用唯一 id 作为 key 值。如果数据项有 id 并且是唯一的,就使用 id 作为 key。如果没有,可以设置一个全局变量来保证 id 的唯一性。

class Example extends React.Component {
	this.listCounter = 1
	//...
	addItem() {
		const id = this.listCounter++;
		this.setState({
		   list: [ {name: 'Baz' + id, id} , ...this.state.list]
		});
    }
	render () {
	//...
	}}

在实际生产环境中,一般使用第三方库来生成唯一 id

const shortid = require('shortid');
// ...
addItem() {
	const id = shortid.generate();
	this.setState({
	   list: [ {name: 'Baz' + id, id} , ...this.state.list]
	});
}
//...
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当你渲染列表并且没有给每个列表项分配一个稳定的标识时,可以使用index作为key。但是,要注意,在某些情况下,使用index作为key可能会导致意外的bug,因此最好在可能的情况下使用稳定的唯一标识符作为key。 ### 回答2: 在React中,当我们使用列表渲染时,需要给每个列表项添加一个唯一的key属性来帮助React更高效地更新和重渲染组件。默认情况下,React使用列表中每个项的索引作为key。然而,并不是所有情况下都适合使用index作为key。 首先,如果列表的顺序会发生变化,例如通过排序或过滤操作,使用index作为key可能会导致问题。因为React会默认使用key来确定组件的更新和重渲染,如果列表顺序改变,原本的项可能会被误以为是新的项,导致组件重渲染出现错误。 此外,如果列表中的项没有唯一标识,且不会改变,那么使用index作为key是可以接受的。例如,渲染一个基本的静态列表时,列表项没有任何变化且没有唯一标识,这时使用index作为key是可以的。 总而言之,在选择key时,我们应该尽量选择具有唯一标识且不会发生变化的作为key使用index作为key应该是我们的最后选择,仅仅在列表项没有唯一标识且没有其他可用选项时才使用。 ### 回答3: 在前端开发中,可以使用index作为key的情况有以下几种: 1. 列表数据没有唯一标识:有时候,我们从服务器获取到的列表数据可能没有唯一标识。如果列表项没有唯一id或其他唯一属性,我们可以使用index作为key来唯一标识列表项,确保React在渲染和更新时不会出现问题。 2. 列表项的顺序会变化:如果列表项的顺序在后续操作中会发生变化(例如,通过拖拽或排序),那么使用index作为key可以确保React正确地识别和更新列表项的顺序。 3. 列表是静态的或无法变化的:如果我们知道列表数据是静态的,或者无法通过更新或删除操作进行修改,那么使用index作为key是安全的。这种情况下,可以确保React能够正确渲染列表。 但是需要注意的是,尽量避免滥用使用index作为key。如果可能,最好使用列表项本身的唯一标识作为key。这样可以提供更好的性能和可维护性,避免因为相同index对应不同的数据导致的渲染问题。因此,在决定是否使用index作为key时,应根据具体需求和列表数据的特点来做出选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值