计算100W条数据的长度造成2s延迟

<template>
<div>
<h1>数据总长度{{ arrList.length }}</h1>
</div>
</template>
<script>
export default {
data(){
return {
arrList: []
}
},
created(){
console.time('赋值代码耗时')
// 我们发现这里赋值耗时1.8s
this.arrList= this.getNewListApi()
console.timeEnd('赋值代码耗时')
},
methods: {
getNewListApi(){
let arr = []
// 100w次循环需要78ms
console.time('100w次循环耗时')
for(let i=0;i<1000000;i++){
arr.push({
name: '张三' + i,
age: i+10,
add:'xxx',
info:'喜欢上班'
})
}
console.timeEnd('100w次循环耗时')
return arr
}
}
}
</script>

使用 Object.freeze 提升效率

created(){
console.time('赋值代码耗时')
this.arrList= Object.freeze(this.getNewListApi())
console.timeEnd('赋值代码耗时')
},

由原来的1.7s变为现在93ms

什么使用 Object.freeze会提升效率呢?

我们都知道vue2中

会把放在data中的数据变成响应式数据。

this.arrList= this.getNewListApi()

这一行代码会把arrList中的100w条数据变成响应式数据。

这样就造成消耗。

实际上我们只需要进行展示,不会做修改操作。

因此我们可以使用 Object.freeze 来冻结数据。

不让它变成响应式数据。从而提升效率。

在我们实际开发中像纯列表(不会做修改,删除,添加,按条件搜索)

我们都可以使用 Object.freeze 来冻结数据。

学习 Object.freeze

Object.freeze() 可以让一个对象被冻结

这个被冻结的对象:

1.不能添加属性,不能删除属性,不能修改属性的值

2.不能更改它们的可枚举性

3.对象的原型也不能被重新指定

freeze()返回与传入的对象相同的对象。

let obj={
name:'张三',
age: 70
}
let newObj = Object.freeze(obj)
newObj.newAddRess = '王者峡谷' // 不能新增属性
delete newObj.name // 不能删除属性
newObj.age = 50 // 不能修改属性
console.log(newObj)
//输出 {"name": "张三","age": 70}

5w条数据渲染出现白屏

<template>
<div>
<div v-for="(item,index) in 50000" :key="index" :data-aIndex="index">
<h4>姓名</h4>
<h4>年龄</h4>
<h4>地址</h4>
<h4>爱好</h4>
<h4>序号{{ index }}</h4>
</div>
</div>
</template>

使用v-if结合requestAnimationFrame让它延迟渲染

// 自定义hook
import { onMounted, onUnmounted, ref } from "vue"
import { onUnmounted, ref } from "vue"
export function useDeferRender(allEleNumber=100){
const frameCount = ref(0);
let requestId;
// 刷新帧的函数
function updateFrameCount(){
requestId = requestAnimationFrame(()=>{
frameCount.value++;
// 当前渲染的帧数大于最大帧数的时候就停止渲染 (说明元素已经渲染完了)
if(frameCount.value >= allEleNumber){
return
}
updateFrameCount()
})
console.log(' frameCount.value', frameCount.value)
};
// 一开始进入就执行这个函数
updateFrameCount();
// 卸载的时候取消掉
onUnmounted(()=>{
cancelAnimationFrame(requestId)
})
// 会返回一个true或者false.来控制是否渲染,让它逐帧渲染
return function deferBool(n){
// 目前渲染了多少帧 >= 这个元素是在第几帧渲染
return frameCount.value >=n
};
}
<template>
<div>
<div v-for="(item,index) in 50000" :key="index" :data-aIndex="index">
<template v-if="deferBool(index)">
<h4>姓名</h4>
<h4>年龄</h4>
<h4>地址</h4>
<h4>爱好</h4>
<h4>序号{{ index }}</h4>
</template>
</div>
</div>
</template>
<script setup>
import {useDeferRender} from '../hooks/useDeferRender.js'
let deferBool = useDeferRender(50000)
</script>

requestAnimationFrame的简单介绍

window.requestAnimationFrame()方法告诉浏览器你希望执行一个动画(一段代码)。

它要求浏览器在下一次重绘之前调用指定的回调函数。

对回调函数的调用频率通常与显示器的刷新率相匹配。

有60hz、75hz、120hz、144hz 。

但是最常见的刷新率还是 60hz(每秒 60 帧)。

它的返回值是一个long 类型整数值。

是在回调列表里的唯一标识符。

你可以将此值传递给 window.cancelAnimationFrame() 函数以取消该刷新回调请求

Object.freeze冻结属性和v-if结合requestAnimationFrame分帧渲染解决白屏的更多相关文章

  1. Object.freeze与 Object.seal的区别

    Object.freeze()冻结一个对象.不能添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性.可配置性.可写性,以及不能修改已有属性的值.冻结一个对象后该对象的原型也不能被修改. ...

  2. 我被冻在了 vue2 源码工具函数第一行Object.freeze()(一)

    前言 最近参加若川的源码共度活动,第 24 期 vue2 源码工具函数,最开始: var emptyObject = Object.freeze({}); 之前知道 Object.freeze() 是 ...

  3. vue Object.freeze() 优化

    参考自:https://segmentfault.com/a/1190000006191558 Object.freeze()是ES5新增的特性,可以冻结一个对象,防止对象被修改. vue 1.0.1 ...

  4. ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)

    前面提到 ES5 对象属性描述符,这篇看看对象的扩展.密封和冻结. 扩展对象 Object.preventExtensions Object.isExtensible 密封对象 Object.seal ...

  5. Object.freeze(); 方法冻结一个对象。

    Object.freeze() 方法可以冻结一个对象.一个被冻结的对象再也不能被修改: 冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性.可配置性.可写性 ...

  6. js 深冻结 与 浅冻结 Object.freeze

    1.深冻结 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ...

  7. javascript EcmaScript5 新增对象之Object.freeze

    我们都知道在js里对象是很容易改变的 var obj1 ={ a:'111' } obj1.a = '222'; console.log( obj.a ) //output 222 对象的属性发生了变 ...

  8. js es6 Object.freeze

    将对象冻结,使用Object.freeze方法 const foo = Object.freeze({}); // 常规模式时,下面一行不起作用: // 严格模式时,该行会报错 foo.prop = ...

  9. Object.freeze

    Object.freeze() 方法可以冻结一个对象.一个被冻结的对象再也不能被修改:冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性.可配置性.可写性, ...

  10. JavaScript内置一些方法的实现原理--Object.freeze()、instanceof

    const定义的常量,一般是不能修改的. 比如: const TIME_OUT = 10000; 但是当值为引用类型值时,还是可以操作对象,扩展或修改对象属性.方法等等. 以下演示代码的操作是不会报错 ...

随机推荐

  1. vscode+码云(gitee),用git进行源代码管理

    使用原因 对于我们经常换电脑来工作的人群,在公司工作完,回家里再用U盘或网盘复制/下载我们的代码,简直是一种折磨,一个项目中断后,时间久了再去想继续的时候,你会发现:到底哪个是最新版的?!U盘满了,这 ...

  2. 轻松玩转pandas

    文章目录 1.pandas简介 2.pandas应用 3.pandas安装 4.Pandas 数据结构 - Series 5.Pandas 数据结构 - DataFrame 6.Pandas CSV ...

  3. Mysql(1)—简介及Windows环境下载安装

    Mysql(1)-简介及Windows环境下载安装 一.关于Mysql 1.1 简介 MySQL是一个流行的关系型数据库管理系统(RDBMS),它基于结构化查询语言(SQL)进行操作.MySQL由瑞典 ...

  4. mongodb插入数据不能在vue显示

    问题描述:当我们在命令行插入数据时,在MongoVUE却显示不了数据,并且查询有插入数据的数据库,如下图所示 网上资料说,这是引擎的问题,mongoDB3.2版本之后默认开启的存储引擎是wiredRi ...

  5. ESP8266+ MQTT+SG90(舵机) platformio

    ESP8266 + MQTT + SG90(舵机) platformio 连线 ESP8266 MG90S(舵机) GND 棕色 VCC 红色 模拟引脚 橙色 源代码 https://gitee.co ...

  6. 使用VSCode进行WSL2的本机调试

    首先我们需要安装Remote Development插件(这个Remote-WSL一定要保证是装上的哦). 然后我们先连接到WSL. (第一次进入远程模式,会慢一些,需要下载一些组件) (如果你打开这 ...

  7. manim边学边做--三维的点和线

    Manim 提供了一系列专为三维空间设计的对象,让创建三维数学动画变得更加轻松. 本篇开始介绍其中最简单的点和线相关对象,也就是Dot3D(三维的点),Line3D(三维的线)和Arrow3D(三维的 ...

  8. 搭建离线yum源

    HTTP方式 安装步骤 系统:CentOS 7.6 yum install -y httpd vi /etc/httpd/conf/httpd.conf <Directory /> Opt ...

  9. CAD Plus 移动端使用帮助

    Mac端使用帮助 English help 如果您有疑问或需要帮助请发送邮件至 3167292926@qq.com 1. 权限要求 1.1 获取位置信息 使用文件管理功能时显示网络信息需要获取位置信息 ...

  10. 不容忽视的PCB测试点,关键时刻可以避免批量事故哦!

    ​  PCB测试点是啥子?请看下图: ​ 如果你曾经用过NOKIA手机,每次你打开后盖换电池的时候,每次看到的那两排圆形的点--就是PCB测试点,or you can call it Test Poi ...