使用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 相关文章推荐
JavaScript中instanceof与typeof运算符的用法及区别详细解析
Nov 19 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
Mar 27 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
Jun 01 Javascript
Javascript中setTimeOut和setInterval的定时器用法
Jun 12 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
Apr 13 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
May 20 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
Nov 04 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
Nov 10 Javascript
js变量值传到php过程详解 将php解析成数据
Jun 26 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
Dec 04 Javascript
JS+css3实现幻灯片轮播图
Aug 14 Javascript
微信小程序抽奖组件的使用步骤
Jan 11 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连接Oracle for NT 远程数据库
2006/10/09 PHP
php 过滤英文标点符号及过滤中文标点符号代码
2014/06/12 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
Laravel 自带的Auth验证登录方法
2019/09/30 PHP
基于JQuery的Select选择框的华丽变身
2011/08/23 Javascript
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
2012/02/27 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
vue中component组件的props使用详解
2017/09/04 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
[48:00]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第二场 11.04
2020/11/04 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
浅析Python中的序列化存储的方法
2015/04/28 Python
python中requests库session对象的妙用详解
2017/10/30 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
Python集合基本概念与相关操作实例分析
2019/10/30 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
《孙权劝学》教学反思
2014/04/23 职场文书
面试通知邮件
2015/04/20 职场文书