v-for中key值如何选择

在Vue中v-for通常会制定一个key属性,但是这个key属性有时候用索引值index,也有时候用id值。其实用id、手机号、身份证号等唯一值作为key更为合适,下面通过代码说明一下key值的选择。

<template>
  <div id="app">
     <ul>
       <!-- 循环列表 使用index值作为key值 -->
       <li v-for="(p, index) of persons" :key="index">
         {{p.name}}-->{{p.age}}
         <input type="text" v-model="p.name">
       </li>
     </ul>
  </div>
</template>

<script>

export default {
  data() {
      return {
        persons:[
			{id:'001',name:'马冬梅',age:30,gender:'女'},
			{id:'002',name:'周冬雨',age:31,gender:'女'},
			{id:'003',name:'周杰伦',age:18,gender:'男'},
			{id:'004',name:'温兆伦',age:19,gender:'男'}
		]
      }
  }
}
</script>

<!-- 循环列表 使用id作为key值 -->
<li v-for="p of persons" :key="p.id">

单纯遍历数组无论是使用id还是index作为key,页面最终显示的结果都是一样的,在这里我们看不出有什么区别。

对数组进行逆序添加、逆序删除等破坏性操作时(以逆序添加为例)

先使用id作为可以key值

<!-- html代码 -->
<div id="app">
    <h2>人员列表</h2>
    <button @click="add">添加一个宋铁</button>
     <ul>
       <!-- 循环列表 使用id作为key值 -->
       <li v-for="p of persons" :key="p.id">
         {{p.name}}-->{{p.age}}
         <input type="text">
       </li>
     </ul>
  </div>


<!-- js代码 -->
methods:{
    add() {
       const tieSong = {id:'005', name:'宋轶', age:18, gender:'女'}
       //往数组第一位追加一个元素
       this.persons.unshift(tieSong)
    }
}

当使用id作为可以值时,显示的结果是正常的

 

使用index作为key值

<li v-for="(p, index) of persons" :key="index">
    {{p.name}}-->{{p.age}}
    <input type="text">
</li>

 点击按钮逆序添加时,结果如下:

 用index作为key值逆序添加的时候,页面发生了错误DOM更新,这是因为Vue中的虚拟DOM对比diff算法,比较规则如下:

当在旧的虚拟DOM中找到与新的虚拟DOM相同的key时:

(1)若虚拟DOM中内容没有发生变化,则直接复用之前真实DOM

(2)若虚拟DOM中内容发生变化时,则生成新的真实DOM替换原来的真实DOM

当在旧的虚拟DOM未找到与新的虚拟DOM相同的key时:

创建真实DOM,重新渲染到页面上

 

总结:key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据新数据生成新的虚拟DOM,随后Vue进行新旧虚拟DOM的差异比较,当key相同,新旧虚拟DOM内容也相同时,则对应的真实DOM复用,不同时则重新生成真实DOM。开发中推荐使用唯一标识作为key值,即使是仅用于渲染列表时,在更新的时候也能更加高效,因为可以直接复用真实DOM。本文仅代表个人见解,如有错误,还请各位批评指证。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Vue,v-for指令用于循环渲染数组或对象的数据,而key属性则是用来帮助Vue识别每个节点的唯一性,从而提高渲染性能的。当Vue更新DOM时,它会根据key来判断哪些节点需要更新,哪些节点需要删除,哪些节点需要新增。如果没有key,Vue会默认使用节点的索引作为key,但这样会导致一些问题,例如当数组的元素顺序发生变化时,Vue会认为这是新增和删除操作,而不是更新操作,从而导致性能问题。因此,我们应该尽可能地为v-for循环的每个节点设置唯一的key,以提高Vue的渲染性能。 ### 回答2: Vue的v-for指令用于渲染循环数据,如一个数组或一个对象。而v-for指令key属性则用于优化Vue在渲染循环数据时的性能。 在Vue的底层实现,v-for指令会尽可能地复用已经存在的元素,而不是每次都重新创建一份新的元素。这个复用的过程是基于每个元素的唯一标识符——key属性。当数据源发生变化时,Vue会对比新旧数据源,并根据key属性的确定哪些元素需要被删除、哪些需要被添加,哪些需要被更新。如果没有key属性,那么Vue只能简单地按顺序对比新旧数据源,这样会降低性能,而且可能出现一些意料之外的问题,如某些元素并没有正确地被更新或删除。 因此,我们在使用v-for指令时,一定要给每个元素加上一个唯一的key属性,这个唯一的key可以是一个数字、一个字符串或一个对象的属性,只要它能够唯一地标识每个元素即可。当一个元素没有唯一的标识符时,可以使用v-bind指令将一个实例属性或计算属性作为key,但是最好不要使用数组的索引作为key,因为这样可能会出现某些元素位置发生变化但不会触发更新的问题。 总之,v-for指令key属性是为了优化Vue在渲染循环数据时的性能而设计的,它可以帮助Vue更准确地复用、更新和删除元素,从而提高应用的渲染性能和用户体验。 ### 回答3: 在Vue,v-for指令通常用于循环渲染一个数组或对象的数据。当循环的数据发生变化时,会在DOM更新相应的元素。在循环渲染key是一个非常重要的属性,它可以提高Vue的性能、避免DOM重复渲染和更新错误等问题。 v-for指令可以接受一个可选的key属性,这个key主要是用于Vue的响应式数据更新机制的。当数据变化时,key属性可以帮助Vue高效地更新DOM,减少不必要的DOM操作。虽然在没有key的情况下Vue也可以正常工作,但如果不加key的话,当数组或对象的数据发生变化时,Vue需要遍历整个循环去查找数据,这将会影响Vue的性能。 除了提高性能,key属性还可以避免DOM重复渲染的问题。Vue会根据每个元素的key属性去标识每个不同的元素,当没有添加key属性而出现重复元素时,Vue会错误地复用原来的元素,从而导致DOM渲染出错。此外,在使用列表循环或其他类似的情况下,添加key属性还可以使Vue的数据更新更加准确,提高框架的稳定性。因此,在使用v-for指令时,建议一定要给每个循环元素添加key属性。 总之,Vue的v-for指令通过key属性能够提高Vue的性能、避免DOM重复渲染和更新错误等问题。在使用Vue开发应用时,必须注意v-for指令的key属性的使用,从而更好地提高应用程序的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值