0


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”。


本文转载自: https://blog.csdn.net/feiying0canglang/article/details/122531960
版权归原作者 IT利刃出鞘 所有, 如有侵权,请联系我们删除。

“Vue--v-for的key的作用--详解/实例”的评论:

还没有评论