当前位置: 首页 > news >正文

记一次v-if和key错误使用,导致vue2的内存爆炸修复!

之前写了一个功能,通过v-for渲染数据,但是数据中存在hidden项,则对数据进行隐藏,由于数据显隐采用了v-if,且循环使用的key,用了(index+900)之类的写法,导致虚拟dom的计算量成倍上涨。
具体问题如下:

<template v-if="showFieldList"><template v-for="(item, index) in fieldList"><template v-if="!item.hidden"><!-- 单选框 --><el-col:span="item.span || 8":key="index + 900"v-if="item.type === 'radio'">......</template></template>
</template>

这里犯了两个重大的错误,
第一,key作为vue虚拟dom中递归判断改变的标志,正确的使用key可以节省很多无畏的性能损失。

设置key与不设置key区别
举个例子:

创建一个实例,2秒后往items数组插入数据

<body><div id="demo"><p v-for="item in items" :key="item">{{item}}</p></div><script src="../../dist/vue.js"></script><script>// 创建实例const app = new Vue({el: '#demo',data: { items: ['a', 'b', 'c', 'd', 'e'] },mounted () {setTimeout(() => { this.items.splice(2, 0, 'f')  // }, 2000);},});</script>
</body>

在不使用key的情况,vue会进行这样的操作:
在这里插入图片描述

分析下整体流程:

比较A,A,相同类型的节点,进行patch,但数据相同,不发生dom操作
比较B,B,相同类型的节点,进行patch,但数据相同,不发生dom操作
比较C,F,相同类型的节点,进行patch,数据不同,发生dom操作
比较D,C,相同类型的节点,进行patch,数据不同,发生dom操作
比较E,D,相同类型的节点,进行patch,数据不同,发生dom操作
循环结束,将E插入到DOM中
一共发生了3次更新,1次插入操作

在使用key的情况:vue会进行这样的操作:

比较A,A,相同类型的节点,进行patch,但数据相同,不发生dom操作
比较B,B,相同类型的节点,进行patch,但数据相同,不发生dom操作
比较C,F,不相同类型的节点
比较E、E,相同类型的节点,进行patch,但数据相同,不发生dom操作
比较D、D,相同类型的节点,进行patch,但数据相同,不发生dom操作
比较C、C,相同类型的节点,进行patch,但数据相同,不发生dom操作
循环结束,将F插入到C之前
一共发生了0次更新,1次插入操作

通过上面两个小例子,可见设置key能够大大减少对页面的DOM操作,提高了diff效率

第二,Vue 官方强烈不建议在 v-for 内使用 v-if,因为这会 导致重复计算。改用 computed 过滤数据:

<!-- 错误做法 -->
<div v-for="item in list" v-if="item.isActive">{{ item.text }}</div><!-- 正确做法 -->
<div v-for="item in activeList" :key="item.id">{{ item.text }}</div><script>
export default {computed: {activeList() {return this.list.filter(item => item.isActive);}}
};
</script>

最后修改为如下写法:

<template v-if="showFieldList"><template v-for="(item, index) in activeList"><template><!-- 单选框 --><el-col:span="item.span || 8":key="item.code"v-if="item.type === 'radio'">......</template></template>
</template>activeList() {return this.fieldList.filter(item => !item.hidden);
}

至此,性能问题基本解决。引以为鉴!

http://www.dtcms.com/a/312294.html

相关文章:

  • 著作权登记遇难题:创作者如何突破确权困境?
  • 【论文阅读|V2M: VISUAL 2-DIMENSIONAL MAMBA FOR IMAGE REPRESENTATION LEARNING】
  • 字节-面试
  • 性能测试工具ApacheBench、Jmeter
  • gitee使用教程
  • 昇思学习营-开发版-模型推理和性能优化
  • 在 Elasticsearch 中使用 LTR 参与检索
  • k8s+isulad 国产化技术栈云原生技术栈搭建3-master节点安装
  • 查找位置函数
  • 垃圾收集器G1ZGC详解
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 77-1(题目+回答)
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 76-1(题目+回答)
  • set和map使用
  • 技巧|SwanLab记录混淆矩阵攻略
  • express-jwt报错:Error: algorithms should be set
  • 【智能体cooragent】不同的单智能体调用的大模型的推理的输入与输出
  • 笔试——Day26
  • 【LLM】如何在Cursor中调用Dify工作流
  • Makefile 从入门到精通:自动化构建的艺术
  • 【Java基础知识 16】 数组详解
  • 微积分思想的严密性转变 | 极限、逼近与程序化
  • 计算机技术与软件专业技术资格(水平)考试简介
  • 【Pytorch✨】LSTM01 入门
  • 集成电路学习:什么是HAL硬件抽象层
  • 【设计模式】 3.设计模式基本原则
  • 对于考研数学的理解
  • 【攻防实战】记一次DOUBLETROUBLE攻防实战
  • build文件夹下面的主要配置文件
  • win10任务栏出问题了,原来是wincompressbar导致的
  • 扫雷游戏完整代码