引言

在前端项目开发过程中,el-table展示的结果列使用组件形式引入,其中某些字段通过:formatter方法转码,结果栏位的字段显示/隐藏控制也使用组件形式引入,前端在控制字段显示属性时,发现码值转换及字段信息展示均有问题。

问题分析

通过阅读代码结构,发现el-table-column通过template循环生成,由于template的作用是模板占位符,可帮助我们包裹元素,但在循环过程当中,template不会被渲染到页面上。有关表格数据渲染中key的作用如下:

  • key作为一个DOM节点的标识值,结合Diff算法可以实现对节点的复用。(key相同的节点会被复用);
  • 只有当key(或其他导致isSameNode判断为false)发生改变时,才会触发节点的重新渲染。否则Vue将会复用之前的节点,通过改变节点的属性来实现节点的更新。

同时,template标签不支持:key属性,

注意: vue实例绑定的元素内部的template标签不支持v-show指令,即v-show="false"对template标签来说不起作用。但是此时的template标签支持v-if、v-else-if、v-else、v-for这些指令。

解决方法

既然template标签不支持key属性,可通过在el-table-column标签加入:key="()"属性,这个key属性是vue自带的特殊属性,主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes,依次来提升页面渲染性能。如果不更新这个key的话,显示/隐藏列的时候,部分DOM不会重新渲染,导致table变化时候内容错乱。

拓展阅读

一、key的作用

前文已经讲到,作为一个DOM节点的标识值,结合Diff算法可实现对节点的复用。(key相同的节点会被复用。)

只有当key(或其他导致isSameNode判断为false)发生改变时,才会触发节点的重新渲染。否则Vue将会复用之前的节点,通过改变节点的属性来实现节点的更新。那么,key使用id与index的区别又是什么呢?

二、key使用id与index的区别

不推荐使用index作为key,因为这种做法会导致某些节点被错误地原地复用,具体如下:

  • 性能损耗:列表渲染时会导致变动项往后的所有列表节点(内容)的更新(相当于key没发挥作用)。
  • 出现错误:某些节点在错误的位置被复用。(例如当列表项中使用到复选框时)

性能损耗

列表渲染时会导致变动项往后的所有列表节点(内容)的更新(相当于key没发挥作用)

需要注意的是,变动项往后的所有列表节点的更新本质是节点属性的更新,节点本身会被复用。


<!-- 测试代码 -->
<template><div><div v-for="(item, index) in arr" :key="index 或 ">{{}}</div></div>
</template><script>
export default {name: 'HelloWorld',data(){return {arr: ({length: 10000}, (v, i) => {return {id: i, data: i}})}},mounted(){setTimeout(()=>{/* 1. this.shiftArr()   // 删除首项或2. this.unShiftArr()    // 在首部插入新项*/}, 1000)},methods: {shiftArr(){();},unshiftArr(){({id: -1, data: -1});}}
}
</script>

上边的例子很简单,就是v-for渲染一个长度为10000的列表,然后在Vue mounted 1s后,执行一个删除列表首项或在列表头插入新项,观察两种key绑定的具体页面更新开销。

页面开销使用chrome的performance选项卡来测算

删除列表首项

列表头 unshift 新元素

出现错误

某些节点在错误的位置被复用。(例如当列表项中使用到复选框时)


<!-- 测试代码 -->
<template><div><button @click="test">删除列表第一项</button><div v-for="(item, index) in arr" :key="index 或 "><input type="checkbox" />{{}}</div></div>
</template><script>
export default {name: 'HelloWorld',data(){return {arr: ({length: 5}, (v, i) => {return {id: i, data: i}})}},methods: {test(){();}}
}
</script>

总结

到此这篇关于Vue页面渲染中key的应用的文章就介绍到这了,更多相关Vue页面渲染key的应用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

  • Vue在页面数据渲染完成之后的调用方法
  • 写给vue新手们的vue渲染页面教程
  • 渲染页面的实例
  • 解决vue页面渲染但dom没渲染的操作
  • 浅谈vue异步数据影响页面渲染

5渲染判断_Vue页面渲染中key的应用实例教程相关推荐

  1. zip在python中的用法_Python中zip()函数用法实例教程

    本文实例讲述了Python中zip()函数的定义及用法,相信对于Python初学者有一定的借鉴价值.详情如下: 一.定义: zip([iterable, ...])zip()是Python的一个内建函 ...

  2. 5渲染判断if_React 16 渲染流程

    学过微机的同学都应该很熟悉「中断」这个概念: CPU 正常运行程序时,内部事件或外设提出中断请求: CPU 予以响应,同时保护好 CPU 执行主程序的现场,转入调用中断服务程序: 调用完毕后恢复现场. ...

  3. 5渲染判断_云渲染怎么收费,5大云渲染平台实测,您选对了吗?

    3DMAX云渲染平台都怎么收费?5大云渲染平台测试后才知道差距这么大,您用对了吗? 本次共计测试了3个镜头,为了让大家很直观地感受各个平台渲染时间和费用上的对比,我整理了个表格,供大家自行参考和判断. ...

  4. 5渲染判断_先渲染再对焦,KeyShot 深度通道在 Photoshop 中的对接

    事情的起因,是在我用华为 P40 Pro 手机的时候,发现华为拍照系统当中的先拍照后对焦功能实在强大,那我会想到这个东西能不能用在我们产品渲染当中呢? 仔细想一想这个东西,无非就是通过距离判断相机对焦 ...

  5. 218.94.78.76:20001/index.php,详解spring中使用Elasticsearch的实例教程

    本篇文章主要介绍了详解spring中使用Elasticsearch的代码实现,具有一定的参考价值,有兴趣的可以了解一下 在使用Elasticsearch之前,先给大家聊一点干货. 1. ES和solr ...

  6. Java中的策略模式实例教程

    策略模式是一种行为模式.用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略. 策略模式也被称作政策模式.实现过程为,首先定义不同的算法策略,然后客户端把 ...

  7. 命令模式 java_JAVA中的命令模式实例教程

    原文链接  作者:Pankaj Kumar 译者:f0tlo <1357654289@qq.com> 命令模式是一种行为模式,因此,它处理的是对象的行为.命令模式为系统中不同的对象提供中性 ...

  8. python教程实例-Python中函数的用法实例教程

    本文以数值计算为例讲述了Python中函数的用法,分享给大家供大家参考借鉴之用.具体如下: 我们都知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需 ...

  9. JAVA中的命令模式实例教程

    原文链接  作者:Pankaj Kumar 译者:f0tlo <1357654289@qq.com> 命令模式是一种行为模式,因此,它处理的是对象的行为.命令模式为系统中不同的对象提供中性 ...

最新文章

  1. 讨论工字型接收线圈天线不同匝数对于低频定位信号检测影响:150kHz导航信号
  2. 使用Grunt搭建自动化的web前端开发环境-完整教程
  3. 【Luogu3383】【模板】线性筛素数
  4. 易成新能加码光伏产业链 作价28.29亿收购赛维两子公司
  5. 【C语言简单说】十:小结
  6. Boyer-Moore 投票算法
  7. 《SpringCloud超级入门》Spring Cloud Eureka是什么?《八》
  8. 江苏自考计算机组成原理多少分及格,自考《计算机组成原理》基本概念第七章...
  9. jQuery EasyUI datagrid实现本地分页的方法
  10. ajax页面载入动画,添加加载动画,jQuery的AJAX .load()
  11. (转)Inno Setup入门(七)——提供安装语言选项
  12. linux下配置samba服务
  13. iOS 模拟器设置输入中文
  14. 第三代oid铺码软件_你好点读笔!自制小达人点读目录册之书名贴铺码
  15. ros2之tello无人机
  16. STM32工作笔记0100---认识设备的IMEI号和SN号的区别
  17. 如何设置IE禁用代理服务器
  18. [教程分享]锐族MP3刷固件教程
  19. maximo工作笔记
  20. 新疆维吾尔自治区坡度数据

热门文章

  1. python 手势检测和追踪_用kinect和python进行手势识别:嗯学习
  2. java实验泛型与容器总结_【Java心得总结三】Java泛型上——初识泛型
  3. Cron 触发器及相关内容 (第二部分)
  4. Java中堆、栈、常量池等概念解析
  5. android handler1--消息队列概念
  6. 加快android编译速度
  7. Tomcat,出现乱码问题
  8. php中对象传值方式,php实现对象传值方式的具体案例
  9. 基于JAVA+SpringBoot+Mybatis+MYSQL的社区物业管理系统
  10. ad15原理图中变压器种类_「知识」共轭结构整流变压器低压输出三排八列短网结构引线布置...