defer表示延迟加载,针对大量节点的渲染加载,结合使用关键帧requestAnimationFrame的形式来分片加载,可以优化白屏时间

知识补充:

requestAnimationFrame

  • requestAnimationFrame 是根据帧数来执行回调函数的,就是屏幕一帧,那 requestAnimationFrame就会执行一次。一般屏幕是60帧,也就是一秒执行60次回调函数.
  • 性能相对定时器settimeout好,因为定时器执行权限在同步任务 微任务之后,会受到其他任务影响。

setTimeout 相比,requestAnimationFrame 最大的优势是由系统来决定回调函数的执行时机。具体一点讲,如果屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次,如果刷新率是75Hz,那么这个时间间隔就变成了1000/75=13.3ms,换句话说就是,requestAnimationFrame 的步伐跟着系统的刷新步伐走。它能保证回调函数在屏幕每一次的刷新间隔中只被执行一次,这样就不会引起丢帧现象,也不会导致动画出现卡顿的问题。

解决方案:分帧渲染策略

VUE2.x


<template><div><div class="container"><div v-for="n in 100" :key="n+'n'"><div class="item_container" v-if="defer(n)"><div class="item_child" v-for="m in 6000" :key="m+'b'"></div>        </div></div>        </div></div>
</template>
<script>export default {name: 'page_Test',data() {return {nodeCount: 0,}},mounted() {方法一let maxNodeCount = 100const refreshNodeCount = () => {requestAnimationFrame((timestamp) => {console.log(timestamp, 'timestamp');//当前帧执行回调时的时间戳(以毫秒为单位,高精度小数)this.nodeCount++if (this.nodeCount < maxNodeCount) {refreshNodeCount()}})}refreshNodeCount()方法二this.update()},methods: {update(){let maxNodeCount = 100requestAnimationFrame((timestamp) => {console.log(timestamp, 'timestamp');//当前帧执行回调时的时间戳(以毫秒为单位,高精度小数)this.nodeCount++if (this.nodeCount < maxNodeCount) {this.update()}})},defer(n){// return 当前页面第几帧渲染 >= n;return this.nodeCount >= n},
}
</script><style lang="less" scoped>
// defer延迟加载
.container {display: grid;grid-template-columns: repeat(3, 1fr);grid-gap: 1em;.item_container {display: flex;flex-wrap: wrap;justify-content: center;border: 3px solid lightblue;}.item_child {width: 5px;height: 3px;background-color: #ccc;margin: 0.1em;}
}
</style>

或者封装方法,Mixins混入使用

export default function(maxNodeCount) {return {data() {return {nodeCount: 0}},mounted() {const refreshFrameCount = () => {requestAnimationFrame(() => {this.nodeCount++if (this.nodeCount < maxNodeCount) {refreshFrameCount()}})}refreshFrameCount()},methods: {defer(n) {// return 当前页面第几帧渲染 >= n;return this.nodeCount >= n}}}}

VUE3.x

封装useDefer.js

import { ref } from 'vue'const nodeCount = ref(0)function update() {nodeCount.value++;requestAnimationFrame(update)}update();export function useDefer() {return function (n) {return nodeCount.value >= n}}

组件使用


<template><div><div class="container"><div v-for="n in 100" :key="n+'n'"><div class="item_container" v-if="defer(n)"><div class="item_child" v-for="m in 6000" :key="m+'b'"></div>        </div></div>        </div></div>
</template><script setup>
import { useDefer} from './useDefer.js'
const defer= useDefer();
</script><style lang="less" scoped>
// defer延迟加载
.container {display: grid;grid-template-columns: repeat(3, 1fr);grid-gap: 1em;.item_container {display: flex;flex-wrap: wrap;justify-content: center;border: 3px solid lightblue;}.item_child {width: 5px;height: 3px;background-color: #ccc;margin: 0.1em;}
}
</style>

这样,就不会影响页面加载前一直显示白屏了~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86156.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86156.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86156.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sentinel与seata组件在微服务中的基本作用

微服务基础内容&#xff1a; 在微服务中&#xff0c;首先学习了微服务的横向拆分与纵向拆分&#xff0c;纵向拆分指按照功能拆分模块&#xff0c;横向拆分指将高复用的模块单独拆分&#xff0c;使纵向拆分的模块去调用这部分内容。 学习了基本拆分后&#xff0c;需要知道微服…

微信点餐小程序—美食物

本项目是基于WAMP Server 和PHP 动态网页技术构建的微信小程序点餐系统&#xff0c;该系统主要分为前端&#xff08;微信小程序&#xff09;和后端&#xff08;基于PHPMySQL服务器端&#xff09; 整体架构流程 1、前端部分 用户界面&#xff1a;展示菜品、处理用户点餐操作、…

记录Idea运行控制台乱码处理方案

记录Idea运行控制台乱码处理方案 方法1&#xff1a;修改运行配置 打开 Run/Debug Configurations在对应的运行配置中 → 找到 VM Options → 添加&#xff1a; -Dfile.encodingUTF-8 -Dsun.jnu.encodingUTF-8重新运行程序 方法2&#xff1a;强制指定输出流编码 在代码中显…

JVM对象内存分配机制全解析

jvm创建对象的内存分配过程 1、逃逸对象在栈上分配 通过在栈上为对象分配内存,使对象占用的内存空间随着方法结束栈帧弹出而销毁,避免了GC垃圾收集器回收对象,减小GC的压力; 栈上分配内存依赖逃逸分析和标量替换。 逃逸分析: 分析对象的动态作用域逃逸:当一个对象在方…

揭秘OSPF核心:LSA类型与路由计算

一、区域内路由计算 同一区域内中的所有路由器有相同的LSDB LSA关键字段&#xff1a; 【1】LS Age&#xff08;链路状态老化时间&#xff09;&#xff1a;LSA生存的时间&#xff0c;单位秒 【2】Option&#xff08;选项字段&#xff09; 【3】LS Type&#xff08;链路状…

英文摘要给成中文摘要模型

你现在使用的 UNIMO 项目&#xff08;PaddlePaddle/Research/NLP/UNIMO&#xff09;&#xff0c;默认是做英文摘要任务&#xff0c;如你在 README 中看到的数据集是 CNN/DailyMail&#xff0c;它是一个 英文摘要数据集。不过&#xff0c;这个项目的架构完全支持中文&#xff0c…

前端面试专栏-主流框架:13.vue3组件通信与生命周期

&#x1f525; 欢迎来到前端面试通关指南专栏&#xff01;从js精讲到框架到实战&#xff0c;渐进系统化学习&#xff0c;坚持解锁新技能&#xff0c;祝你轻松拿下心仪offer。 前端面试通关指南专栏主页 前端面试专栏规划详情 Vue3组件通信与生命周期深度解析 在Vue3的开发体系…

自动化交易优化网格策略

一、动态参数调整 1. 网格间距优化 - 波动率自适应&#xff1a;使用平均真实波幅&#xff08;ATR&#xff09;指标动态调整间距。例如&#xff0c;当ATR值上升20%时&#xff0c;将间距从原定的1%扩大至1.5%&#xff1b;ATR下降时则缩小间距至0.8%。可通过Python的TA-Lib库实时计…

测试平台ui自动化demo说明

1. 要启动celery worker windows 开发时&#xff0c;用第二行 。&#xff08;试过&#xff0c;可以&#xff09;&#xff0c;第一行的没试过。 celery -A myproject worker --loglevelinfo # windows电脑用下面的&#xff0c;并且settings中还要加那个solo celery -A your_p…

五大主要Token类型之字符标记Token

如大家所了解的&#xff0c;在数字化时代&#xff0c;我们每天都会与Token&#xff08;令牌&#xff09;打交道——无论是在线支付、登录社交媒体&#xff0c;还是调用API接口&#xff0c;都离不开这一关键技术。 今天我们主要来学习&#xff1a;字符标记Token 在自然语言处理…

可理解性输入:洗澡习惯

一、开场与淋浴准备 Today we’re going to learn bathroom English. Let’s get started. So the first thing we want to do. Make sure we have our towel and we’ll hang it on the towel rack before we have a shower. Because if we have a shower and then forget ou…

GO Echo框架面试题及参考答案

目录 Echo 框架的核心结构是什么?Echo 和 Context 分别扮演什么角色? 如何创建一个 Echo 实例?简述常见配置项。 e.Start () 与 e.StartServer () 的区别是什么? Echo 如何实现基于先后顺序路由匹配? 如何注册 GET、POST、PUT、DELETE 等不同 HTTP 方法的路由? Echo…

Java 中LinkedList 总结

406.根据身高重建队列 力扣题目链接(opens new window) 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高…

大模型微调:从零到实践,掌握AI大模型的核心技能

大模型微调&#xff1a;从零到实践&#xff0c;掌握AI大模型的核心技能 引言 大规模语言模型&#xff08;如DeepSeek、通义千问&#xff09;的出现&#xff0c;彻底改变了自然语言处理的格局。这些模型不仅在学术界取得了突破性进展&#xff0c;在工业界也得到了广泛应用。 …

Flutter - 原生交互 - 相册

环境 Flutter 3.29 macOS Sequoia 15.4.1 Xcode 16.3 iOS 13.4.1 iOS 18.5 集成image_picker 在Flutter中可以使用image_picker插件实现从相册中获取图片 添加插件 flutter中访问相册image_picker插件 flutter pub add image_pickerflutter pub getXcode工程的GenerateP…

node.js在vscode的配置

文章目录 概要1. 使用和webstrom一样的快捷键2. 让vscode的主题变成webstrom3. 如何在 Node.js 环境下写代码3.1 使用 ESLint配置规则3.2 配置.vscode/settings.json 4. Prettier安装5. 其它问题解决 概要 node.js在webstrom编辑器中可以完美使用代码提示、错误提示等功能&…

Android14音频子系统-Audio HAL分析

文章目录 1&#xff09;概述2&#xff09;HAL的打开流程3&#xff09;HAL库的实现(Qualcomm)4&#xff09;tinyalsa5&#xff09;数据结构6&#xff09;代码流程 1&#xff09;概述 1、回顾HAL、tinyalsa与linux driver的关系 2、与AudioFlinger的关系 3、 1、如何判断当前…

前端与 Spring Boot 后端无感 Token 刷新 - 从原理到全栈实践

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

【AI智能体】新手教程-通过 Chat SDK 搭建网页在线客服

通过扣子搭建的智能体可以一键发布为 Chat SDK&#xff0c;快速部署到你的自建网站中&#xff0c;作为在线智能客服面向网站的用户提供 AI 答疑服务。本文档介绍通过 Chat SDK 搭建网页版在线客服的详细操作步骤。 场景说明 网站作为企业和组织与用户互动的重要平台&#xff…

flask静态资源与模板页面、模板用户登录案例

案例代码 import flask# template_folder 模板文件夹(静态页面 html页面渲染) # static_folder 静态资源文件夹主要存放的是类似静态数据、音频、视频、图片等 app flask.Flask(__name__, static_folderstatic, template_foldertemplate)app.route(/) def index():# render_t…