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

vue如何使用冻结对象提升代码效率及其原理解析

先给大家伙整个实际工作中一定会碰到的问题

如下vue dome ,它的代码非常简单功能也1非常简单,就是一个按钮,点击后会显示有多少条数据
在这里插入图片描述
来看看源码,
html部分就是一个按钮绑定了一个loadData事件,然后在p标签内展示了这个myData这个数据的长度

	<template><div id="app"><button @click="loadData">加载数据</button><p>加载了{{ myData.length  }}条数据</p></div></template>

js部分,可以看到loadData函数调用了getData函数,getData函数会循环十万次,得到十万个数据,然后将这十万个数据赋值给mydata
给页面渲染

	export default {name: 'App',data() {return {myData:[]}},methods: {loadData() {this.myData = this.getData()},getData() {const result = [];for (let i = 0; i < 100000; i++){result.push({id: i,name: `my name is ${i}`,son: {id: `${i+1}`,name:`His name is ${i+1}`}})}return result}},

现在的情况是,当点击按钮时,页面要过很久才做出响应,.打开i控制台使用性能分析器记录可以看到如下显示

渲染和绘制的事件加起来才用6ms,当然这也是对的,本来也就显示一个按钮和一段文本,用不了多长时间
主要是script脚本运行时间长,用来6635 ms,这也太久了,
在这里插入图片描述
既然是script耗费了这么多时间,那么点开事件树,一路展开,

可以发现getData这个函数只用了348ms才占用了百分之5.2的时间,proxySetter这个函数占用6647.8ms,也就是说,效率主要损耗在这个函数里面了,
在这里插入图片描述
再接着展开proxySetter,于是就发现了老朋友observe,能来花时间看这篇文章的都是学过vue的,对这个函数应该都很熟悉,

不熟悉也没关系,你只要知道vue就是靠这个来完成响应式的.它遍历数组,遍历对象,遍历它们里面的每一个属性,而且是深度遍历,

给每一个属性使用Object.defineProperty来进行响应式处理,所以时间主要损耗在这里,

但是很多时候,并不是每一个数据都需要使用响应式,就如同这个dome中的例子,只是想简简单单的展示一下这个数据的长度,这个数据的内容
又不会变化,没必要给它添加响应式
在这里插入图片描述
那有没有什么办法解决这个问题呢?
有,可以使用一段简单的代码,如下

	loadData() {this.myData =Object.freeze(this.getData()) },

使用这段代码给不希望vue处理的对象冻结了.vue会判断这个对象是否被冻结了,如果被冻结了,就不会再去给他遍历添加侦听了,

再次使用性能分析查看,可以发现这次只用了五百多毫秒.
在这里插入图片描述

相关文章:

  • Linux中systemv共享内存
  • 亿道信息新品EM-T195轻薄型工业平板,隆重登场!
  • Linux下检查端口占用
  • 3.1log | 62.不同路径,63. 不同路径 II,343. 整数拆分,96.不同的二叉搜索树
  • 【考研数学】零基础备考全年计划
  • 单调栈的理解
  • Facebook的元宇宙实践:数字化社交的新前景
  • 4.1.CVAT——目标检测的标注详细步骤
  • 【HbuilderX】 uniapp实现 android申请权限 和 退出app返回桌面
  • 加密与安全_探索口令加密算法(PBE)
  • 【应用多元统计分析】--数据矩阵及R语言表示
  • Flink CDC 3.0 Starrocks建表失败会导致任务卡主!
  • 吸猫毛空气净化器哪个好?推荐除猫毛效果好宠物空气净化器品牌
  • paper-ai :搜索真实文献并生成引用真实文献的AI论文
  • 华为 OD 一面算法原题
  • magento 货币换算
  • mysql_config not found
  • Sublime text 3 3103 注册码
  • 阿里研究院入选中国企业智库系统影响力榜
  • 大型网站性能监测、分析与优化常见问题QA
  • 今年的LC3大会没了?
  • 悄悄地说一个bug
  • 如何合理的规划jvm性能调优
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 听说你叫Java(二)–Servlet请求
  • 通过git安装npm私有模块
  • 温故知新之javascript面向对象
  • 2017年360最后一道编程题
  • gunicorn工作原理
  • ​水经微图Web1.5.0版即将上线
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • %@ page import=%的用法
  • (Python) SOAP Web Service (HTTP POST)
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (超详细)语音信号处理之特征提取
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (利用IDEA+Maven)定制属于自己的jar包
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (算法)前K大的和
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 事件模型教程(二)
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net6 Api Swagger配置
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • @Valid和@NotNull字段校验使用
  • [ JavaScript ] JSON方法
  • [100天算法】-二叉树剪枝(day 48)
  • [2023年]-hadoop面试真题(一)
  • [22]. 括号生成
  • [ARM]ldr 和 adr 伪指令的区别
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [BUUCTF 2018]Online Tool
  • [bzoj1912]异象石(set)