Vue 2.0 v-for 响应式key, index及item.id参数对v-bind:key值造成差异研究

在github上阅览README.md以获得最佳阅读体验,点这里

v-for响应式key, index及item.id参数对v-bind:key值造成差异研究

实验背景

通常情况下,我们渲染一个li列表,采用v-for指令进行渲染,我们需要给渲染的每一项元素绑定一个key值,其实绑定该key值是可选的,但会引起警告。使用v-for参数的过程中,由于v-for提供三个参数,分别是: value, key, index。对其哪一个作为元素绑定key值更能得到我们想要的响应式渲染作出实验。

实验目的

总结出在采用不同参数作为元素绑定key值时,出现的不同的渲染结果,得出最优渲染方案

实验准备

我们准备第三个可以作为绑定key值的变量,分别是:

  • 渲染item自带属性id
  • v-for提供的key
  • v-for提供的index

我们制定一个参照表格


li绑定key值类型 id index key
实验一 选取 x x
实验二 x 选取 x
实验三 x x 选取

实验一

  • li绑定key值为自带属性id
  • 分别控制两个变量:改变id值,对li进行排序
实验vue.js代码
// items data
items: [
{
id: 2,
},
{
id: 1,
},
{
id: 3,
},
{
id: 4,
},
]
<!-- dom constructor -->
<template>
<div class="content">
<ul>
<li class="animate">对照组</li>
<li v-for="(item, key, index) in items" class="animate" v-bind:key="item.id">{{item.id}}</li>
<!-- 当前绑定值为item.id -->
</ul>
</div>
</div>
</template>

首先使用了item.id作为绑定的key值,我们来看下效果:
渲染效果demo

  1. 改变第一个元素的id值,第一个li元素重新渲染,其余三个li元素与对照组速度始终保持一致,没有变化,说明li元素单独渲染
  2. 为了验证1.观点,我们对实验组按照升序进行排列,查看DOM结构,当改变第一个元素位置时,第一个li元素重新渲染,其余三个li元素不重新渲染且与对照组速度始终保持一致,说明第一个li元素单独渲染,验证1.结论

实验二

  • li绑定key值为 v-for提供的index参数
  • 分别控制两个变量:改变id值,对li进行排序
实验vue.js代码
// items data
items: [
{
id: 2,
},
{
id: 1,
},
{
id: 3,
},
{
id: 4,
},
]
<!-- dom constructor -->
<template>
<div class="content">
<ul>
<li class="animate">对照组</li>
<li v-for="(item, key, index) in items" class="animate" v-bind:key="index">{{item.id}}</li>
<!-- 当前绑定值为index -->
</ul>
</div>
</div>
</template>

在实验二中,使用v-for提供的index参数作为绑定的key值,我们来看下效果:
渲染效果demo

  1. 改变第一个元素的id值,第一个li元素与其余三个li元素与对照组速度始终保持一致,没有变化,说明绑定index值并未对li渲染造成影响
  2. 为了验证1.观点,我们对实验组按照升序进行排列,查看DOM结构,当改变第一个元素位置时,第一个li元素重新渲染,其余三个li元素也重新渲染均且与对照组速度始终保持一致,说明所有li元素均重新渲染,验证1.结论

实验三

  • li绑定key值为 v-for提供的key参数
  • 分别控制两个变量:改变id值,对li进行排序
实验vue.js代码
// items data
items: [
{
id: 2,
},
{
id: 1,
},
{
id: 3,
},
{
id: 4,
},
]
<!-- dom constructor -->
<template>
<div class="content">
<ul>
<li class="animate">对照组</li>
<li v-for="(item, key, index) in items" class="animate" v-bind:key="key">{{item.id}}</li>
<!-- 当前绑定值为key -->
</ul>
</div>
</div>
</template>

在实验二中,使用v-for提供的key参数作为绑定的key值,我们来看下效果:
渲染效果demo

  1. 改变第一个元素的id值,第一个li元素与其余三个li元素与对照组速度始终保持一致,没有变化,说明绑定key值并未对li渲染造成影响
  2. 为了验证1.观点,我们对实验组按照升序进行排列,查看DOM结构,当改变第一个元素位置时,第一个li元素重新渲染,其余三个li元素也重新渲染均且与对照组速度始终保持一致,说明所有li元素均重新渲染,验证1.结论

实验结论

经过三次对照实验(我们的实验采用了控制变量法,对照实验法进行),我们可以得出结论:使用v-for渲染元素时,使用元素自身的id属性去指定渲染元素的key值有利于单个元素的重新渲染,若采用其他如v-for提供的index, key等值,在改变渲染出来的DOM结构时,会触发所有元素的重新渲染,当数据过大时,可能会造成性能负担。

总结

当我们在使用v-for进行渲染时,尽可能使用渲染元素自身属性的id给渲染的元素绑定一个key值,这样在当前渲染元素的DOM结构发生变化时,能够单独响应该元素而不触发所有元素的渲染。

研究成员

TimRChen
libook

转载原文地址:https://www.cnblogs.com/tim100/p/7262963.html#4274591

v-for(:key)绑定index、id、key的区别的更多相关文章

  1. v-for为什么要加key,能用index作为key么

    前言 在vue中使用v-for时,一直有几个疑问: v-for为什么要加key 为什么有时候用index作为key会出错 带着这个疑问,结合各种博客和源码,终于有了点眉目. virtual dom 要 ...

  2. mysql中key 、primary key 、unique key 与index区别

    一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id ) NOT NULL auto_increment, ) default NU ...

  3. Mysql中Key与Index的区别

    mysql的key和index多少有点令人迷惑,这实际上考察对数据库体系结构的了解的. 1 key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查 ...

  4. MySQL中KEY、PRIMARY KEY、UNIQUE KEY、INDEX 的区别

    参考:MySQL中KEY.PRIMARY KEY.UNIQUE KEY.INDEX 的区别 对于题目中提出的问题,可以拆分来一步步解决.在 MySQL 中 KEY 和 INDEX 是同义.那这个问题就 ...

  5. React 等框架使用 index 做 key 的问题

    React 等框架使用 index 做 key 的问题 假如有两个树,一个是之前,一个是更变之后,我们抽象成两种可能性. 插入内容在最后 插入内容在最前 关于插在中间,原理一样,就不阐述. 使用 ul ...

  6. 【Mysql】key 、primary key 、unique key 与index区别

    参考:https://blog.csdn.net/nanamasuda/article/details/52543177 总的来说,primary key .unique key 这些key建立的同时 ...

  7. Vue2.0中v-for迭代语法变化(key、index)

    语法发生了变化:http://blog.csdn.net/sinat_35512245/article/details/53966788 新数组语法 value in arr (value, inde ...

  8. Mysql索引详解及优化(key和index区别)

    MySQL索引的概念    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库 ...

  9. 【Mysql优化】key和index区别

    mysql的key和index多少有点令人迷惑,这实际上考察对数据库体系结构的了解的.    1).key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引 ...

随机推荐

  1. 2019-2-16-WPF-封装-dotnet-remoting-调用其他进程

    title author date CreateTime categories WPF 封装 dotnet remoting 调用其他进程 lindexi 2019-02-16 09:40:26 +0 ...

  2. php_imagick是怎么实现复古效果的呢?

    php_imagick程序示例 1.创建一个缩略图并显示出来 <?phpheader('Content-type: image/jpeg');$image = new Imagick('imag ...

  3. 自学FPGA笔记之 “sublime的使用”

    之前用的notepad++,现在新发现一款软件:sublime.调出一整个逻辑块,写代码能快一点,而且常见的always之类的词汇还不易输入错误,并且比较不容易漏掉begin  end.现在总结一下自 ...

  4. 洛谷 P3258 [JLOI2014]松鼠的新家 树链剖分+差分前缀和优化

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 说明 思路 AC代码 优化 优化后AC代码 总结 题面 题目链接 P3258 [JLOI2 ...

  5. 常用的Markdown编辑器, markdown导出HTML/PDF/JSON/word

              markdown导出word.             常用的Markdown 编辑器 OSX Atom,setting-->package install,搜package ...

  6. Python发送邮件(带附件的)

    有时候做自动化测试任务,任务完成后,需要将结果自动发送一封邮件,这里用到smtplib模块,直接导入就行,这里以163邮箱为例,需要用到授权码,我用类写一下: 如果是发送qq邮箱,要将smtp 改成s ...

  7. iOS 多个精致动画

    iOS 多个精致动画  http://www.cocoachina.com/bbs/read.php?tid=301262 iOS 零碎小知识     http://www.cocoachina.co ...

  8. ELK练习

    1.ELK练习 PUT s3/_doc/ { "mappings" : { "doc" : { "properties" : { " ...

  9. sql select时增加常量列

    阅读更多 string sql="select a,b,'常量' as c from table" 注:单引号' ' 很重要,否则编译时会把其看成查询参数,从而提示参数未指定错误. ...

  10. 2019-11-20-dotnet-Blazor-用-C#-控制界面行为

    title author date CreateTime categories dotnet Blazor 用 C# 控制界面行为 lindexi 2019-11-20 18:26:25 +0800 ...