VUE中的组件加载方式
加载方式有哪些,及如何进行选择
常规的静态引入是在组件初始化时就加载所有依赖的组件,而懒加载则是等到组件需要被渲染的时候才加载。
对于大型应用,可能会有很多组件,如果一开始都加载,可能会影响首屏加载时间。如果某些组件在首屏不需要,比如弹窗或者标签页里的内容,那么懒加载会更好,减少初始加载时间,实现时使用动态导入和异步组件,同时注意处理加载状态和错误处理。。反之,如果组件在页面初始化时就必须显示,那么静态加载更合适,因为懒加载可能会导致组件显示延迟,甚至出现闪烁。
首屏必需的组件静态加载,非必需的懒加载。根据组件的使用频率和重要性,结合同步和异步加载。
两种加载策略对比
1.静态加载(初始加载/同步加载)
优点:组件立即可用,无渲染延迟
缺点:如果组件较多或较大,会增加初始加载时间,影响首屏渲染速度。
适合场景:首屏核心组件、高概率使用的组件、小型组件
2.异步加载(按需加载)
优点:减小初始包体积,提升首屏速度
缺点:首次渲染需要加载时间,可能造成短暂延迟。实现稍微复杂,需要处理加载状态(如加载中、加载失败等)。
适合场景:非首屏组件、弹窗/抽屉等交互型组件、复杂大型组件
代码示例
1. 静态加载
<template><div><ComponentA /><ComponentB /></div></template><script setup>// 导入组件import ComponentA from './ComponentA.vue';import ComponentB from './ComponentB.vue';</script>
2. 异步加载
2.1Vue的defineAsyncComponent来按需加载组件。
<template><div><ComponentA /><ComponentB /></div></template><script setup>import { defineAsyncComponent } from 'vue';// 异步导入 LoadingSpinner 组件import LoadingSpinner from './LoadingSpinner.vue';// 定义异步组件 ComponentAconst ComponentA = defineAsyncComponent(() => import('./ComponentA.vue'));// 定义异步组件 ComponentBconst ComponentB = defineAsyncComponent({loader: () => import('./ComponentB.vue'),loadingComponent: LoadingSpinner, // 加载状态组件delay: 200, // 延迟显示loading的时间timeout: 3000 // 超时时间});</script>
2.2使用动态导入
<template><div><ComponentA v-if="showComponentA" /><button @click="loadComponentA">Load Component A</button></div></template><script setup>import { ref } from 'vue';const showComponentA = ref(false);const ComponentA = shallowRef(null);//使用shallowRef来保存组件,因为组件对象不需要深度响应式,避免不必要的响应式开销const loadComponentA = async()=> {const module = await import('./ComponentA.vue');ComponentA.value = module.default;showComponentA.value = true;}</script>
若需调用引入组件中的某些方法,需进行一些处理。
问题原因
在 Vue 3 中,ref 绑定到组件实例时,ref 的值会在组件挂载完成后才被赋值。当你第一次调用 handleEdit 时,<Edit> 组件可能还没有完成挂载,因此 editRef.value 为 null。第二次调用时,组件已经挂载完成,所以 editRef.value 能够正确获取到组件实例。
根本原因
-
异步组件加载延迟:
-
使用 defineAsyncComponent 加载的组件是异步的,组件加载和挂载需要时间。
-
在 showEdit.value = true 后,组件开始加载,但加载和挂载是异步的,因此 editRef.value 不会立即被赋值。
-
-
nextTick 的局限性:
-
nextTick 只会等待当前 DOM 更新完成,但不会等待异步组件加载完成。
-
因此,即使使用 nextTick,editRef.value 仍然可能为 null。
-
1、使用 Promise 和 requestAnimationFrame 轮询检查
<Edit v-if="showEdit" ref="editRef" @fetch-data="fetchData" /><script setup>const editRef = ref(null)const showEdit = ref(false)const Edit = defineAsyncComponent(() => import('./components/edit'))const handleEdit = async (type, row) => {showEdit.value = trueawait new Promise((resolve) => {const checkComponentLoaded = () => {if (editRef.value && typeof editRef.value.showDialog === 'function') {resolve()requestAnimationFrame(checkComponentLoaded)}}checkComponentLoaded()})editRef.value.showDialog(type, row)}</script>
* 使用 requestAnimationFrame 进行轮询会不断消耗性能,因为它会在每一帧都执行检查逻辑。
* 如果组件加载时间较长,轮询逻辑可能会持续运行,导致性能问题。
2、使用 watch 监听 editRef 的变化
<Edit v-if="showEdit" ref="editRef" @fetch-data="fetchData" />const editRef = ref(null)const showEdit = ref(false)const Edit = defineAsyncComponent(() => import('./components/edit'))const handleEdit = async (type, row) => {showEdit.value = trueconst stopWatch = watch(editRef,(newVal) => {if (newVal && typeof newVal.showDialog === 'function') {newVal.showDialog(type, row)stopWatch() // 停止监听}},{ immediate: true })}
* 使用 watch 监听 editRef 的变化,避免了轮询的性能消耗。
相关文章:
VUE中的组件加载方式
加载方式有哪些,及如何进行选择 常规的静态引入是在组件初始化时就加载所有依赖的组件,而懒加载则是等到组件需要被渲染的时候才加载。 对于大型应用,可能会有很多组件,如果一开始都加载,可能会影响首屏加载时间。如…...
天 锐 蓝盾终端安全管理系统:办公U盘拷贝使用管控限制
天 锐 蓝盾终端安全管理系统以终端安全为基石,深度融合安全、管理与维护三大要素,通过对桌面终端系统的精准把控,助力企业用户构筑起更为安全、稳固且可靠的网络运行环境。它实现了管理的标准化,有效破解终端安全管理难题…...
计算机网络之物理层——基于《计算机网络》谢希仁第八版
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...
区块链中的递归长度前缀(RLP)序列化详解
文章目录 1. 什么是RLP序列化?2. RLP的设计目标与优势3. RLP处理的数据类型4. RLP编码规则详解字符串的编码规则列表的编码规则 5. RLP解码原理6. RLP在以太坊中的应用场景7. 编码示例分析8. 总结 1. 什么是RLP序列化? 递归长度前缀(RLP&…...
分布式简单理解
基本概念 应⽤(Application)/系统(System) 为了完成⼀整套服务的⼀个程序或者⼀组相互配合的程序群。⽣活例⼦类⽐:为了完成⼀项任 务,⽽搭建的由⼀个⼈或者⼀群相互配的⼈组成的团队。 模块(Module)/组件…...
记录:Docker 安装记录
今天在安装 ollama 时发现无法指定安装目录,而且它的命令行反馈内容很像 docker ,而且它下载的模型也是放在 C 盘,那么如果我 C 盘空间不足,就装不了 deepseek-r1:70b ,于是想起来之前安装 Docker 的时候也遇到过类似问…...
Leetcode 二叉树展开为链表
java solution class Solution {public void flatten(TreeNode root) {//首先设置递归终止条件if(root null) return;//分别递归处理左右子树,//递归需要先处理子问题(子树的拉平),然后才能处理当前问题(当前节点的指…...
IEEE官方期刊缩写查询pdf分享
可以直接保存...
RabbitMQ 消息队列 优化发送邮件
express 发送邮件 最简单的异步发送邮件方法为何要使用 RabbitMQ?如何在 Node 项目中集成 RabbitMQ? 一、 不用 await 发送邮件 在实际开发之前,不妨先思考下,我们最终的目的是为了让邮件异步发送。那发送邮件这里有个await&am…...
【AI】常见的AI工具地址和学习资料链接
AI工具地址: DeepSeek:DeepSeekChatGPT-4o:https://openai.com/chatgpt/overview/Kimi:Kimi.ai - 会推理解析,能深度思考的AI助手豆包:豆包讯飞星火:讯飞星火大模型-AI大语言模型-星火大模型-科…...
NetLogon 权限提升漏洞
参考文章:CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客 域控机器账户:WIN-0V0GAORDC17 域控 ip:192.168.72.163 域内攻击者机器 ip:192.168.72.158,host:WIN10-01 攻击者 kali…...
【C++】 Flow of Control
《C程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记 文章目录 1、选择结构1.1、if 语句1.2、嵌套的 if 语句1.3、条件运算符 ?:1.4、switch 语句 2、循环结构2.1、while 语句2.2、do-while 语句2.3、 for 循环2.4、循环嵌套…...
图论 之 迪斯科特拉算法求解最短路径
文章目录 题目743.网络延迟时间3341.到达最后一个房间的最少时间I 求解最短路径的问题,分为使用BFS和使用迪斯科特拉算法,这两种算法求解的范围是有区别的 BFS适合求解,边的权值都是1的图中的最短路径的问题 图论 之 BFS迪斯科特拉算法适合求…...
module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法
module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法 pip install opencv-python4.7.0.72 -i https://pypi.tuna.tsinghua.edu.cn/simple 测试: python -c"import cv2"...
Spring Boot 中事务的用法详解
引言 在 Spring Boot 中,事务管理是一个非常重要的功能,尤其是在涉及数据库操作的业务场景中。Spring 提供了强大的事务管理支持,能够帮助我们简化事务的管理和控制。本文将详细介绍 Spring Boot 中事务的用法,包括事务的基本概…...
【react18】如何使用useReducer和useContext来实现一个todoList功能
重点知识点就是使用useReducer来攻坚小型的公共状态管理,useImmerReducer来实现数据的不可变 实现效果 实现代码 项目工程结构 App.js文件 import logo from "./logo.svg"; import "./App.css"; import TodoLists from "./comps/TodoLi…...
Android GreenDAO 适配 AGP 8.0+
在 Android 中使用 GreenDao,由于 GreenDao 现在不维护,所以更新到新版本的 Gradle 经常出问题,在这记录一些升级遇到的问题,并且记录解决方案。 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 一、‘:app…...
一篇搞懂vue3中如何使用ref、reactive实现响应式数据
ref 可实现 基本类型、对象类型响应式数据 reactive:只能实现 对象类型响应式 ref实现 基本类型 数据响应式: <template><div class"person"><h2>姓名:{{ name }}</h2><h2>年龄:{{ ag…...
【HeadFirst系列之HeadFirst设计模式】第7天之命令模式:封装请求,轻松实现解耦!
命令模式:封装请求,轻松实现解耦! 大家好!今天我们来聊聊设计模式中的命令模式(Command Pattern)。如果你曾经需要将请求封装成对象,或者希望实现请求的撤销、重做等功能,那么命令模…...
简单封装一个websocket构造函数
问题描述 最近维护一个老项目,发现项目中有大量重复代码,特别是websocket的调用这一块,同样的代码复制了十几个页面,于是自己封装了一个websocket调用的构造函数。 export default class CreateWebSocket {constructor(url) {//…...
Linux-Ansible自动化运维
文章目录 自动化运维Ansible 🏡作者主页:点击! 🤖Linux专栏:点击! ⏰️创作时间:2025年02月21日17点38分 自动化运维 自动化运维常用工具 Ansible 和 SaltStack 自动化运维优势: 服…...
uni-app(位置1)
文章目录 一、获取当前的地理位置、速度 uni.getLocation(OBJECT)二、打开地图选择位置 uni.chooseLocation(OBJECT)三、使用应用内置地图查看位置。uni.openLocation(OBJECT) 一、获取当前的地理位置、速度 uni.getLocation(OBJECT) App平台 manifest中配置好自己的地图厂商k…...
RabbitMQ服务异步通信
消息队列在使用过程中,面临着很多实际问题需要思考: 1. 消息可靠性 消息从发送,到消费者接收,会经理多个过程: 其中的每一步都可能导致消息丢失,常见的丢失原因包括: 发送时丢失: 生…...
CSS基础(浮动、相对定位、绝对定位、固定定位、粘性定位、版心、重置默认样式)
文章目录 1. 浮动(float)1.1 简介1.2 元素浮动后的特点1.3 脱离文档流示例图1.4 浮动产生的影响1.4.1 积极影响1.4.2 消极影响 1.5 解决浮动产生的影响1.5.1 清除浮动(Clearfix)1.5.2 创建新的块格式化上下文(BFC&…...
Spring Cloud — Hystrix 服务隔离、请求缓存及合并
Hystrix 的核心是提供服务容错保护,防止任何单一依赖耗尽整个容器的全部用户线程。使用舱壁隔离模式,对资源或失败单元进行隔离,避免一个服务的失效导致整个系统垮掉(雪崩效应)。 1 Hystrix监控 Hystrix 提供了对服务…...
RagFlow+Ollama 构建RAG私有化知识库
RagFlowOllama 构建RAG私有化知识库 关于RAG一、什么是RAGFlow一、RAGFlow 安装配置测服已有服务: mysql、redis、elasticsearch 二、RAGFlow 配置 ollama:本地运行大型语言模型的工具软件。用户可以轻松下载、运行和管理各种开源 LLM。降低使用门槛&…...
【Linux】【网络】不同子网下的客户端和服务器通信
【Linux】【网络】不同子网下的客户端和服务器通信 前两天在进行socket()网络编程并进行测试时,发现在不同wifi下两个电脑无法进行连接,大概去查找了如何解决 看到可以使用 frp 这个快速反向代理实现。 frp 可让您将位于 NAT 或防火墙后面的本地服务器…...
SpringBoot教程(十四) SpringBoot之集成Redis
SpringBoot教程(十四) | SpringBoot之集成Redis 一、Redis集成简介二、集成步骤 2.1 添加依赖2.2 添加配置2.3 项目中使用之简单使用 (举例讲解)2.4 项目中使用之工具类封装 (正式用这个)2.5 序列化 &…...
DeepSeek掘金——VSCode 接入DeepSeek V3大模型,附使用说明
VSCode 接入DeepSeek V3大模型,附使用说明 由于近期 DeepSeek 使用人数激增,服务器压力较大,官网已 暂停充值入口 ,且接口响应也开始不稳定,建议使用第三方部署的 DeepSeek,如 硅基流动 或者使用其他模型/插件,如 豆包免费AI插件 MarsCode、阿里免费AI插件 TONGYI Lin…...
OpenHarmony分布式数据管理子系统
OpenHarmony分布式数据管理子系统 简介 目录 组件说明 分布式数据对象数据共享分布式数据服务Key-Value数据库首选项关系型数据库标准数据化通路 相关仓 简介 子系统介绍 分布式数据管理子系统支持单设备的各种结构化数据的持久化,以及跨设备之间数据的同步、…...
