VUE中演示v-for为什么要加key

说到这个问题想必要举个例子了

image

没有key

 <div id="app">
    <div>
      <input type="text" v-model="name">
      <button @click="add">添加</button>
    </div>
    <ul>
      <li v-for="(item, i) in list">
        <input type="checkbox"> {{item.name}}
      </li>
    </ul>
<script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: ‘#app‘,
      data: {
        name: ‘‘,
        newId: 3,
        list: [
          { id: 1, name: ‘李斯‘ },
          { id: 2, name: ‘吕不韦‘ },
          { id: 3, name: ‘嬴政‘ }
        ]
      },
      methods: {
        add() {
         //注意这里是unshift
          this.list.unshift({ id: ++this.newId, name: this.name })
          this.name = ‘‘
        }
      }
    });
  </script>
  </div>

当选中吕不为时,添加楠楠后选中的确是李斯,并不是我们想要的结果,我们想要的是当添加楠楠后,一种选中的是吕不为

key1.jpg

key3.jpg

有key

  <div id="app">
    <div>
      <input type="text" v-model="name">
      <button @click="add">添加</button>
    </div>
    <ul>
      <li v-for="(item, i) in list" :key="item.id">
        <input type="checkbox"> {{item.name}}
      </li>
    </ul>
<script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: ‘#app‘,
      data: {
        name: ‘‘,
        newId: 3,
        list: [
          { id: 1, name: ‘李斯‘ },
          { id: 2, name: ‘吕不韦‘ },
          { id: 3, name: ‘嬴政‘ }
        ]
      },
      methods: {
        add() {
         //注意这里是unshift
          this.list.unshift({ id: ++this.newId, name: this.name })
          this.name = ‘‘
        }
      }
    });
  </script>
  </div>

同样当选中吕不为时,添加楠楠后依旧选中的是吕不为。

key1.jpg

key2.jpg

可以简单的这样理解:加了key(一定要具有唯一性) id的checkbox跟内容进行了一个关联。是我们想达到的效果

查过相关文档,图例说明很清晰。

vue和react的虚拟DOM的Diff算法大致相同,其核心是基于两个简单的假设
首先讲一下diff算法的处理方法,对操作前后的dom树同一层的节点进行对比,一层一层对比,如下图:

before.png

当某一层有很多相同的节点时,也就是列表节点时,Diff算法的更新过程默认情况下也是遵循以上原则。
比如一下这个情况:

3297464-ee627869a6714336.jpg

我们希望可以在B和C之间加一个F,Diff算法默认执行起来是这样的:

3297464-d912523aac5fd108.jpg

即把C更新成F,D更新成C,E更新成D,最后再插入E,是不是很没有效率?

所以我们需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

3297464-650689b4bd4b9eb6.jpg

vue中列表循环需加:key="唯一标识" 唯一标识可以是item里面id index等,因为vue组件高度复用增加Key可以标识组件的唯一性,为了更好地区别各个组件 key的作用主要是为了高效的更新虚拟DOM

原文地址:https://www.cnblogs.com/sexintercourse/p/12258180.html

时间: 2024-08-29 10:06:03

VUE中演示v-for为什么要加key的相关文章

Vue 中的 v - if 和 v - show + v-for

v-if   v-show v-if是动态的向DOM树内添加或者删除DOM元素: v-if和v-show 都可以控制显示隐藏 v-if 它是没有加载DOM结构 可以叫做惰性加载 <div id="app"><h1 v-if='true'>{{msg1}}</h1> <span>显示</span> <br><h1 v-if='false'>{{msg2}}</h1> <span>不

在Vue中的load或ready的加载时机

1.我们来插入一段代码来分析: Js代码如下 <script type="text/javascript"> var app = new Vue({ el: '#app', data: {}, mounted: function () { var interval = 2000; Resize(); Map(); setInterval("Map()", interval); dateTimer(); setInterval("dateTime

VUE中以v开头的代码和if判断

v-model="变量名"     双向数据绑定一个变量,基本用在input里获取用户输入的内容v-bind:class="变量名"huo :class="变量名"    双向数据绑定一个变量,用于改变当前标签的class类和CSS样式内容 if判断 v-if="变量名" 或 v-if="变量名 === 值? 结果:结果" (三目判断)    相当于js的if判断,如果是隐藏则当前标签彻底注释不存在 <

在react或vue中,for循环用Index作为key值是好还是坏呢?

React 与 vue的基本实现原理是通过对比两次虚拟dom的不同 然后直接操作不同的dom 当以数组的下标index作为key值时  其中一个元素发生了变化 就有可能导致所有元素的key值发生改变  diff算法是比较同级之间的不同  以key来进行关联  当对数组进行下标的变换时,比如删除第一条数据,那么以后所有的Index都会发生改变,那么key自然也跟着全部发生改变, 所以index作为key值是不稳定的,这种不稳定性有可能导致性能的浪费 导致diff无法关联起上一次一样的数据  因此

vue中prop传值时加不加v-bind(冒号:)

前言:有关Vue中父组件通过prop传值给子组件时,是否加v-bind的问题,没弄清楚时感觉很乱,弄清楚之后很简单. 由于结果记起来很容易,所以先给出结果: 只有传递字符串常量时,不采用v-bind形式,其余情况均采用v-bind形式传递. 传入String类型 传入的值title为一个常量(静态prop)时,不加v-bind(或者:) <blog-post title="My journey with Vue"></blog-post> 传入的值title为一

vue中路由按需加载的几种方式

使用vue-cli构建项目后,我们会在Router文件夹下面的index.js里面引入相关的路由组件,如: import Hello from '@/components/Hello' import Boy from '@/components/Boy' import Girl from '@/components/Girl' 普通加载的缺点: webpack在打包的时候会把整个路由打包成一个js文件,如果页面一多,会导致这个文件非常大,加载缓慢 1.require.ensure()实现按需加载

vue中加载three.js的gltf模型

vue中加载three.js的gltf模型 一.开始引入three.js相关插件.首先利用淘宝镜像,操作命令为: cnpm install three //npm install three也行 二.three.js中所有的控件插件,都可以在node_modules下面的three里面找到 三.安装好以后,在页面中引入three.js并使用:在所调用页面引入的代码为 import * as THREE from "three"; import { GLTFLoader } from &

3-7 Vue中的列表渲染

 举个案例:循环data中的list的值在div中,并显示相应的index值. 关于数组的循环: //显示效果如下图: //一般的列表渲染最好带一个key值,要把key值设置为唯一值的话,可以选择index.但在频繁操作DOM元素相对应的数据的时候,它还是有点浪费性能,可能让Vue没法充分复用DOM节点,所以不太建议用index来做key值 //所以一般的项目中的后端会传递过来一些数据,这些数据可以把它作为key值来使用(一般会携带一个后端或数据库相关的一个唯一的数据条目标识符,例如:id) /

理解Vue中的Render渲染函数

VUE一般使用template来创建HTML,然后在有的时候,我们需要使用javascript来创建html,这时候我们需要使用render函数.比如如下我想要实现如下html: <div id="container"> <h1> <a href="#"> Hello world! </a> </h1> </div> 我们会如下使用: <!DOCTYPE html> <html