Vue页面渲染中key的应用实例教程


Posted in Vue.js onJanuary 12, 2021

引言

在前端项目开发过程中,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="Math.random()"属性,这个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 或 item.id">
  {{item.data}}
 </div>
 </div>
</template>

<script>
export default {
 name: 'HelloWorld',
 data(){
 return {
  arr: Array.from({length: 10000}, (v, i) => {return {id: i, data: i}})
 }
 },
 mounted(){
 setTimeout(()=>{
  /* 
  1. this.shiftArr()	// 删除首项
  或
  2. this.unShiftArr()	// 在首部插入新项
  */
 }, 1000)
 },
 methods: {
 shiftArr(){
  this.arr.shift();
 },
 unshiftArr(){
  this.arr.unshift({id: -1, data: -1});
 }
 }
}
</script>

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

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

删除列表首项

Vue页面渲染中key的应用实例教程

列表头 unshift 新元素

Vue页面渲染中key的应用实例教程

出现错误

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

<!-- 测试代码 -->
<template>
 <div>
 <button @click="test">删除列表第一项</button>
 <div v-for="(item, index) in arr" :key="index 或 item.id">
  <input type="checkbox" />
  {{item.data}}
 </div>
 </div>
</template>

<script>
export default {
 name: 'HelloWorld',
 data(){
 return {
  arr: Array.from({length: 5}, (v, i) => {return {id: i, data: i}})
 }
 },
 methods: {
 test(){
  this.arr.shift();
 }
 }
}
</script>

总结

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

Vue.js 相关文章推荐
Vue实现图书管理小案例
Dec 03 Vue.js
vue 通过base64实现图片下载功能
Dec 19 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
vue二选一tab栏切换新做法实现
Jan 19 Vue.js
如何使用RoughViz可视化Vue.js中的草绘图表
Jan 30 Vue.js
vue 根据选择的月份动态展示日期对应的星期几
Feb 06 Vue.js
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
vue3使用vue-router的完整步骤记录
Jun 20 Vue.js
vue-router中hash模式与history模式的区别
Jun 23 Vue.js
vue中div禁止点击事件的实现
Apr 02 Vue.js
vue自定义右键菜单之全局实现
Apr 09 Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 #Vue.js
vue 页面跳转的实现方式
Jan 12 #Vue.js
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 #Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 #Vue.js
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 #Vue.js
vue实现防抖的实例代码
Jan 11 #Vue.js
Vuex实现简单购物车
Jan 10 #Vue.js
You might like
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
关于javascript中的parseInt使用技巧
2009/09/03 Javascript
基于mootools插件实现遮罩层新手引导
2012/05/24 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
jQuery插件Tooltipster实现漂亮的工具提示
2015/04/12 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
Python实现程序的单一实例用法分析
2015/06/03 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
python读取Excel实例详解
2018/08/17 Python
python 实现倒排索引的方法
2018/12/25 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
2019/07/25 Python
python中eval与int的区别浅析
2019/08/11 Python
如何在python中实现随机选择
2019/11/02 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
老公给老婆的道歉信
2014/01/10 职场文书
节水倡议书范文
2014/04/15 职场文书
纪律教育学习心得体会
2014/09/02 职场文书
市场营销计划书
2015/01/17 职场文书
留学推荐信中文范文
2015/03/26 职场文书
借条如何写
2015/05/26 职场文书
2015年秋季运动会广播稿
2015/08/19 职场文书
2016大学生国家助学贷款承诺书
2016/03/25 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
吃通javascript正则表达式
2021/04/21 Javascript
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python
docker-compose部署Yapi的方法
2022/04/08 Servers