Vue--v-for的key的作用--详解/实例

原文网址:Vue--v-for的key的作用--详解/实例_IT利刃出鞘的博客-CSDN博客

简介

说明

        本文用示例介绍Vue中的v-for的key的作用。

        这个key不仅仅可以用于v-for,其他一些地方也可以。详见:API — Vue.js

官网

列表渲染 — Vue.js

API — Vue.js

key的作用

总结

        在Vue中,key是虚拟DOM的标识符。Vue会建立一个Map,value为虚拟DOM(是一个对象),key与value配对。

        在v-for指令中,默认情况下,列表的index作为key。我们也可以手动指定key。

概述

        key 主要用在 Vue 的虚拟 DOM 算法(在新旧 nodes 对比时比较 VNodes)。

        建议尽可能在使用 v-for 时提供 key attribute,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。

不使用 key

说明

        如果不使用 key,会以数据的index来匹配。

        详细地讲:默认情况下,Vue 会最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素(就地更新)。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。

优点

  1. 性能高

缺点

  1. 不适用于依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出。

使用 key

        如果使用 key ,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。

        有相同父元素的子元素必须有独特的 key。重复的 key 会造成渲染错误。

示例

公共代码

路由(router/index.js)

import Vue from 'vue'
import Router from 'vue-router'
import Demo from "../views/Demo";

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/demo',
      name: 'Demo',
      component: Demo,
    }
  ],
})

示例1:不使用key

场景复现

代码

Demo.vue

<template>
  <div class="hello">
      <div
        v-for="(item, index) in dataList"
      >
        <input type="checkbox">
        {{item.name}}
        <button @click="deleteItem(index)">删除此项</button>
      </div>
  </div>
</template>

<script>
export default {
  name: 'Demo',
  data () {
    return {
      dataList: [
        {
          id: 1,
          name: 'Tony1',
        },
        {
          id: 2,
          name: 'Tony2',
        },
        {
          id: 3,
          name: 'Tony3',
        },
      ],
    }
  },
  methods: {
    deleteItem(index) {
      this.dataList.splice(index, 1);
    }
  }
}
</script>

<style scoped>

</style>

测试

访问:http://localhost:8080/#/demo

第1步:选中其中一项(本处选择第2项)

第2步:删除第1项

可以看到,删除第1项之后,选择项由原来的“Tony2”变成了“Tony3”。

原因分析

        默认使用“就地更新”的策略。这个策略实际上是以数据的index来匹配的。

        数据项的顺序被改变,Vue 不移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。

        对于本例而言,第1项被删除之后,原来的第2项成为了第1项,原来的第3项成为了第2项。

示例2:将index作为key

        下边这种写法的结果和上边“示例1:不使用key”一模一样。因为不写key的时候,默认用的就是index。

Demo.vue

<template>
  <div class="hello">
      <div
        v-for="(item, index) in dataList"
        :key="index"
      >
        <input type="checkbox">
        {{item.name}}
        <button @click="deleteItem(index)">删除此项</button>
      </div>
  </div>
</template>

<script>
export default {
  name: 'Demo',
  data () {
    return {
      dataList: [
        {
          id: 1,
          name: 'Tony1',
        },
        {
          id: 2,
          name: 'Tony2',
        },
        {
          id: 3,
          name: 'Tony3',
        },
      ],
    }
  },
  methods: {
    deleteItem(index) {
      this.dataList.splice(index, 1);
    }
  }
}
</script>

<style scoped>

</style>

示例3:将id作为key

代码

Demo.vue

<template>
  <div class="hello">
      <div
        v-for="(item, index) in dataList"
        :key="item.id"
      >
        <input type="checkbox">
        {{item.name}}
        <button @click="deleteItem(index)">删除此项</button>
      </div>
  </div>
</template>

<script>
export default {
  name: 'Demo',
  data () {
    return {
      dataList: [
        {
          id: 1,
          name: 'Tony1',
        },
        {
          id: 2,
          name: 'Tony2',
        },
        {
          id: 3,
          name: 'Tony3',
        },
      ],
    }
  },
  methods: {
    deleteItem(index) {
      this.dataList.splice(index, 1);
    }
  }
}
</script>

<style scoped>

</style>

测试

访问:http://localhost:8080/#/demo

第1步:选中其中一项(本处选择第2项)

第2步:删除第1项

可以看到,删除第1项之后,选择项仍然是的“Tony2”。

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT利刃出鞘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值