vue、react中循环遍历为什么会有key,key有什么作用?

react

先讲一下,vue和react都是在操作虚拟dom,并且根据diff算法进行新旧dom对比,从而更新dom,以vue举例:

vue官方文档中写到有

key 的特殊属性主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes。如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法。使用 key,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。

什么意思呢?就是说,key值的存在保证了唯一性,可以用于dom的重新渲染或是就地复用。

举例来讲:

<div >

<div v-for="i in dataList">{{ i }}</div>

</div>

var vm = new Vue({

el: '#app',

data: {

dataList: [1, 2, 3, 4, 5]

}

})

以上例子会渲染出5个dom节点,我们分别给每个增加一个id值,也就是key,如下:

[

'<div>1</div>', // id: A

'<div>2</div>', // id: B

'<div>3</div>', // id: C

'<div>4</div>', // id: D

'<div>5</div>' // id: E

]

我们改变listdata的数据使dom进行变化

vm.dataList = [4, 1, 3, 5, 2] // 数据位置替换

// 没有key的情况, 节点位置不变,但是节点innerText内容更新了

[

'<div>4</div>', // id: A

'<div>1</div>', // id: B

'<div>3</div>', // id: C

'<div>5</div>', // id: D

'<div>2</div>' // id: E

]

// 有key的情况,dom节点位置进行了交换,但是内容没有更新

// <div v-for="i in dataList" :key='i'>{{ i }}</div>

[

'<div>4</div>', // id: D

'<div>1</div>', // id: A

'<div>3</div>', // id: C

'<div>5</div>', // id: E

'<div>2</div>' // id: B

]

vue在执行时,会对节点进行检查,如果没有key值,那么,vue检查到这里有dom节点,则会对内容进行清空,并且赋予新值;如果有key值的存在,那么vue会对oldnode和newnode进行对比,发现两者key值是否相同,进行调换位置或是删除操作。

基于上述说法,不得不说,编写key值和不编写key值在时间上一定会有所差异(有key值的速度相对慢,但属于用户无法感知到),但时间上的快慢不属于key值的作用。

key值的作用是:

更精准-->在虚拟dom节点中赋予key值,会更加快速的拿到需要的目标节点,不会造成就地复用的情况,对于节点的把控更加精准。

以上是 vue、react中循环遍历为什么会有key,key有什么作用? 的全部内容, 来源链接: utcz.com/z/381847.html

回到顶部