使用vue for时为什么要key【推荐】


Posted in Javascript onJuly 11, 2019

前言:

用vue框架写前端代码时经常会用用到v-for这个方法,但使用此方法时vue推荐我们加上一个唯一标识key这是为什么呢?阅读了网上各位大神的文章以及自己的一些理解对这个问题有了新的认识。所以记录下来,若各位看官看到文章里面有错误的地方请指正一下。谢谢各位大佬。

一.diff算法

修改渲染真实的dom会引起整个dom树的重绘和重排。diff算法可以帮助我们只对我们想要修改的部分进行更新而不会引起整个dom树的重绘和重排。 我们先根据dom生成virtual DOM,当virtual Dom上的某个dom节点数据改变后会生成一个新的Vnode.将新生成的Vnode和oldVnode做对比。发现有修改的地方就直接渲染到真实的dom树上。

diff算法一边比较新旧节点的区别一边在真实的dom树上打补丁

二.key的作用

我个人觉得key的作用就是为了快速的找到新节点对应的旧节点。key是给每一个vnode唯一的id,可以依靠key,更准确, 更快的拿到oldVnode中对应的vnode节点。但不使用key时代码也可以运行但是会报warning.为什么呢。

三.不使用key时的执行

例:不使用key 一个数组arr=['1','2','3','4','5','6']

<view v-for='arr'>
    {{item}}
  </view>

上面代码会生成6个div每个div对应的arr中的数字。现在我们将arr变成[0, 1, 2, 3, 7, 8, 9]。更新渲染的步骤时这样的原先div中的1变成0 2变成1以此类推最后新增一个div内容为9。 Vue会通过改变原来元素的内容和增加/减少元素来完成这个改变,因为没有key属性,Vue无法跟踪每个节点,只能通过这样的方法来完成变更。

四.使用key时

例:numbers为[1, 2, 3, 7, 8, 9]

<div v-for="(num, index) in numbers" :key="index">
   {{num}}
  </div>

变成了[0, 1, 2, 3, 7,8,9]新增一个

元素,它的内容为0,并将它插入原先内容为1的元素之前。 在有了key属性之后,Vue会记住元素们的顺序,并根据这个顺序在适当的位置插入/删除元素来完成更新,这种方法比没有key属性时的就地复用策略效率更高。 总体来说,当使用列表渲染时,永远添加key属性,这样可以提高列表渲染的效率,提高了页面的性能。

总结

以上所述是小编给大家介绍的使用vue for时为什么要key属性,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jQuery 全选效果实现代码
Mar 23 Javascript
JavaScript 异步调用框架 (Part 5 - 链式实现)
Aug 04 Javascript
JavaScript将相对地址转换为绝对地址示例代码
Jul 19 Javascript
jquery队列函数用法实例
Dec 16 Javascript
js格式化时间的方法
Dec 18 Javascript
浅析在javascript中创建对象的各种模式
May 06 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
Sep 12 Javascript
js实现返回顶部效果
Mar 10 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
Aug 31 Javascript
微信上传视频文件提示(推荐)
Nov 22 Javascript
JS实现的字符串数组去重功能小结
Jun 17 Javascript
vue实现公告栏文字上下滚动效果的示例代码
Jun 16 Javascript
利用Angular7开发一个Radio组件的全过程
Jul 11 #Javascript
vue发送websocket请求和http post请求的实例代码
Jul 11 #Javascript
微信小程序之几种常见的弹框提示信息实现详解
Jul 11 #Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
Jul 11 #jQuery
vue项目中实现缓存的最佳方案详解
Jul 11 #Javascript
浅入深出Vue之组件使用
Jul 11 #Javascript
elementUI 动态生成几行几列的方法示例
Jul 11 #Javascript
You might like
PHP动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
ThinkPHP中create()方法自动验证表单信息
2017/04/28 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
在视频前插入广告
2006/11/20 Javascript
javascript知识点收藏
2007/02/22 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
浅谈js中调用函数时加不加括号的问题
2016/07/28 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
AngularJS遍历获取数组元素的方法示例
2017/11/11 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
vue如何限制只能输入正负数及小数
2019/07/04 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
python使用turtle库绘制树
2018/06/25 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
使用HTML5原生对话框元素并轻松创建模态框组件
2019/03/06 HTML / CSS
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
期终自我鉴定
2014/02/17 职场文书
汉语言文学毕业求职信
2014/07/17 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
心灵点滴观后感
2015/06/02 职场文书
2016年3月份红领巾广播稿
2015/12/21 职场文书